自定義注解

  • 定義注解類
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 {
}

  • 攔截標(biāo)記
/**
 * 公共的靜態(tài)常量類
 */
public class CommonFinal {
    //由于處理統(tǒng)一返回值時(shí)打標(biāo)記
    public static final String RESPONSE_RESULT_ANN="RESPONSE-RESULT-ANN";
}

  • 攔截器打標(biāo)記

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ù)。

友情鏈接更多精彩內(nèi)容