• 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

  • 相关阅读:
    软件工程概论之web基础
    java动手动脑——异常处理
    Java动手动脑——多态和继承
    java字串
    数据结构——用栈来判断回文字符串
    java一个能记录生成多少个对象的类
    openwrt设置默认登陆密码
    在ubuntu中安装luci解决iwinfo.h No such file or directory问题
    添加mysamba
    更改默认打开wifi功能
  • 原文地址:https://www.cnblogs.com/june0816/p/14355790.html
Copyright © 2020-2023  润新知