Spring参数解析器HandlerMethodArgumentResolver

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

https://my.oschina.net/u/3195939/blog/4707620

https://blog.csdn.net/songzehao/article/details/99641594

原文地址:https://www.cnblogs.com/june0816/p/14355790.html