一、引入Why
1. @RequestBody注解,可以把請求里的參數,自動映射到方法里的參數
2. 如果方法里的參數,不只是請求里的參數,還有cookie里的數據,消息頭的數據
3. 並且希望Controller的接口仍然接受一個參數對象,參數已經組裝好了
4. 這時候需要HandlerMethodArgumentResolver接口
二、概念What
HandlerMethodArgumentResolver是一個接口,包含兩個方法
public interface HandlerMethodArgumentResolver {
// 條件,當返回值為true時,才調用resolveArgument()方法 boolean supportsParameter(MethodParameter var1);
// @Nullable Object resolveArgument(MethodParameter var1, @Nullable ModelAndViewContainer var2, NativeWebRequest var3, @Nullable WebDataBinderFactory var4) throws Exception; }
三、用法How
1. 創建參數解析器類,實現HandlerMethodArgumentResolver接口,重寫接口的兩個方法
public class DefArgumentResolver implements HandlerMethodArgumentResolver { @Override public boolean supportsParameter(MethodParameter methodParameter) { //方法參數是User 則使用此解析器 return User.class.isAssignableFrom(methodParameter.getParameterType()); } @Override public Object resolveArgument( MethodParameter methodParameter, @Nullable ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, @Nullable WebDataBinderFactory webDataBinderFactory) throws Exception {
// 獲取請求 HttpServletRequest servletRequest = nativeWebRequest.getNativeRequest(HttpServletRequest.class); String info = (String) nativeWebRequest.getAttribute("params", NativeWebRequest.SCOPE_REQUEST); //獲取消息頭認證信息,沒有后續操作了,根據業務實際來解析校驗該token String token = servletRequest.getHeader("Authorization"); //自己塞數據進去,也可以從配置文件獲取數據 return new User("zhangsan",18); } }
2. 添加自定義的解析器到解析器集合,類似攔截器
@Component //一定要將自己的擴展類加到容器中 public class DefWebMvcConfigurer implements WebMvcConfigurer { public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) { resolvers.add(new DefArgumentResolver()); } }
3. 在Controller里獲取到封裝好的參數對象
@RestController public class Controller { @GetMapping("/test") public String test(User user){ return user.toString(); } }
參考:
http://www.likecs.com/show-83637.html