一、引入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