import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
/**
* 自定義統(tǒng)一返回值注解
*/
@Retention(RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Documented
public @interface ResponseResult {
}
/**
* 公共的靜態(tài)常量類
*/
public class CommonFinal {
//由于處理統(tǒng)一返回值時(shí)打標(biāo)記
public static final String RESPONSE_RESULT_ANN="RESPONSE-RESULT-ANN";
}
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
//請(qǐng)求攔截器
@Slf4j
@Component
public class ResponseResultInterceptor implements HandlerInterceptor {
// 代碼核心思想,就是獲取此請(qǐng)求,是否需要返回值包裝,設(shè)置一個(gè)屬性標(biāo)記。
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// log.info("-------------進(jìn)入攔截器打標(biāo)記------");
if(handler instanceof HandlerMethod){
final HandlerMethod handlerMethod= (HandlerMethod) handler;
final Class<?> clazz=handlerMethod.getBeanType();
final Method method=handlerMethod.getMethod();
//判斷是否在類對(duì)象上加了注釋
if(clazz.isAnnotationPresent(ResponseResult.class)){
//設(shè)置此請(qǐng)求返回體,需要包裝,往下傳遞,在ResponseBodyAdvice接口進(jìn)行判斷
request.setAttribute(CommonFinal.RESPONSE_RESULT_ANN,clazz.getAnnotation(ResponseResult.class));
}
//判斷方法上是否有注釋
else if(method.isAnnotationPresent(ResponseResult.class)){
//設(shè)置此請(qǐng)求返回體,需要包裝,往下傳遞,在ResponseBodyAdvice接口進(jìn)行判斷
request.setAttribute(CommonFinal.RESPONSE_RESULT_ANN,method.getAnnotation(ResponseResult.class));
}
}
return true;
}
}
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
import javax.servlet.http.HttpServletRequest;
/**
* 上面代碼就是判斷是否需要返回值包裝,如果需要就直接包裝。這里我們只處理了正常成功的包裝,如果方法體報(bào)異常怎么辦?處理異常也比較簡(jiǎn)單,只要判斷body是否為異常類。
*/
@Slf4j
@ControllerAdvice
public class ResponseResultHandler implements ResponseBodyAdvice<Object> {
//是否請(qǐng)求,包含了包裝,注解,標(biāo)記,沒(méi)有就直接返回,不要重寫(xiě)返回體
@Override
public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
// log.info("判斷是否打有標(biāo)記 --------------------------");
ServletRequestAttributes sra= (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request=sra.getRequest();
//判斷請(qǐng)求是否包含標(biāo)記
ResponseResult responseResult= (ResponseResult) request.getAttribute(CommonFinal.RESPONSE_RESULT_ANN);
return responseResult==null?false:true;
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
// log.info("進(jìn)入返回體 重寫(xiě)格式 處理中 --------------------------");
return Result.success(body);
}
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。