十九、springboot使用@ControllerAdvice(二)之深入理解


前言:

接口類項目開發時,為了便於后期查找問題,一般會攔截器或過濾器中記錄每個接口請求的參數與響應值記錄,
請求參數很容易從request中獲取,但controller的返回值無法從response中獲取,有一個簡單的方法,在controller接口的最后將返回值保存到request域中,這種方法雖然簡單,但是開發起來太麻煩,需要在每個controller的最后添加一行代碼,且該功能不屬於業務功能,不應該接口中去實現,應該有個全局的處理方法。
 
ControllerAdvice是springmvc controller增強器
 
ControllerAdvice三個用處:
1. ModelAttribute: 暴露@RequestMapping 方法返回值為模型數據:放在功能處理方法的返回值上時,是暴露功能處理方法的返回值為模型數據,用於視圖頁面展示時使用。
2. InitBinder : 用於自定義@RequestMapping 方法參數綁定
3. ResponseBodyAdvice : 用於@ResponseBody返回值增加處理
ControllerAdvice初始化:
Spring mvc 啟動時調用RequestMappingHandlerAdapter類的initControllerAdviceCache()方法進行初始化
 
ResponseBodyAdvice : 可以對@ResponseBody的返回值進行加工處理,它是一個接口類,具體處理可以自定義實現類注入到responseBodyAdviceBeans中既可,注入過程由RequestMappingHandlerAdapter類的initControllerAdviceCache去做,開發者只需要自定義實現類實現ResponseBodyAdvice 接口並添加類注解@ControllerAdvice
 

ResponseBodyAdvice

ResponseBodyAdvice是spring4.1的新特性,其作用是在響應體寫出之前做一些處理;比如,修改返回值、加密等。

我在項目中的用到@ControllerAdvice,ResponseBodyAdvice來做一個Controller增強器,將Controller接口的響應(Response)放到請求上下文中 

  介紹:https://blog.csdn.net/u012852374/article/details/53837156

項目中Controller增強器:

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.servlet.mvc.method.annotation.ResponseBodyAdvice;

import com.generalichina.wolong.base.BaseResponse;

@ControllerAdvice
public class ResponseAdvisor implements ResponseBodyAdvice<Object> {

    /**
     * 判斷支持的類型 
     */
    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
     //注意,這里必須返回true,否則不會執行beforeBodyWrite方法 
        return true;
    }

    /**
     * 過濾
     * 
     */
    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
            Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,
            ServerHttpResponse response) {

        String requestPath = request.getURI().getPath();// 普通response不進行過濾
        if (!requestPath.startsWith("/credit")) {
            return body;
        }

        //如果是返回客戶端模板類不進行過濾
        if (body instanceof BaseResponse) {
            return body;
        }

        return new BaseResponse(body);
    }

}

 

 

RequestBodyAdvice和ResponseBodyAdvice

  介紹:https://blog.csdn.net/qq_16504067/article/details/73225005


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM