zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    类中以双下划线開始的方法
    Dynamics CRM2016 新功能之从CRM APP中导出数据至EXCEL
    敏捷项目管理实践
    Hibernate环境搭建
    ubuntu12.04更新软件源时出现校验和不符
    修炼你自己
    http自己定义超时检測方法、主动抛出异常
    sql server 2008安装图解
    Ural 1353 Milliard Vasya&#39;s Function(DP)
    待字闺中之构造最大数分析
  • 原文地址:https://www.cnblogs.com/june0816/p/14355790.html
Copyright © 2011-2022 走看看