springboot使用@ControllerAdvice(二)之深入理解
阿新 • • 發佈:2018-12-11
前言:
介面類專案開發時,為了便於後期查詢問題,一般會攔截器或過濾器中記錄每個介面請求的引數與響應值記錄, 請求引數很容易從request中獲取,但controller的返回值無法從response中獲取,有一個簡單的方法,在controller介面的最後將返回值儲存到request域中,這種方法雖然簡單,但是開發起來太麻煩,需要在每個controller的最後新增一行程式碼,且該功能不屬於業務功能,不應該介面中去實現,應該有個全域性的處理方法。 ControllerAdvice是springmvc controller增強器 ControllerAdvice三個用處:1. ModelAttribute: 暴露@RequestMapping 方法返回值為模型資料:放在功能處理方法的返回值上時,是暴露功能處理方法的返回值為模型資料,用於檢視頁面展示時使用。 2. InitBinder : 用於自定義@RequestMapping 方法引數繫結 3. ResponseBodyAdvice : 用於@ResponseBody返回值增加處理
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); } }https://www.cnblogs.com/soul-wonder/p/9084318.html
RequestBodyAdvice和ResponseBodyAdvice