• 使用 HandlerMethodArgumentResolver 自定义处理Controller中接收参数


    一、

    1、配置类中加 自定参数解析器

    /**
     * 注册外部的interceptor WebConfig
     */
    @Configuration
    public class WebConfig implements WebMvcConfigurer {
    
        /**
         * 配置外部HandlerMethodArgumentResolver
         */
        @Override
        public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
            argumentResolvers.add(new HandleFirstArgsRevlover());
        }
    }
    

      

    2、  使用自定义参数解析器,先判断参数中包含如果 UserInfo类型参数时会执行 resolveArgument,并返回处理后的参数 如action

    /**
     * 保存用户信息
     * @param userInfo
     * @param role
     * @return
     */
    @RequestMapping("saveUser")
    public Result saveUserInfo(com.hualala.order.common.Common.UserInfo  userInfo, Role role){
    
        System.out.println("userInfo = " + userInfo);
    
        return new Result();
    }
    

      

    当saveUserinfo执行时,所有默认解析器和自定义解析器会遍历每个参数,如遍历到符合HandleFirstArgsRevlover会进行处理(每个参数会进行参数解析器遍历匹配),如果supportsParameter返回ture符合会执行resolveArgument并返回处理后的参数对象

    public class HandleFirstArgsRevlover implements HandlerMethodArgumentResolver {
        /**
         * 验证参数是否满足,返回 true: 执行resolveArgument , fasle:不执行执行resolveArgument
         * @param parameter
         * @return
         */
        @Override
        public boolean supportsParameter(MethodParameter parameter) {
            Class<?> paraType = parameter.getParameterType();
            return null == paraType.getAnnotationsByType(RequestBody.class) && UserInfo.class.equals(paraType);
    
        }
    
        @Override
        public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
            HttpServletRequest request=webRequest.getNativeRequest(HttpServletRequest.class);
            String userId= request.getParameter("id");
            if(StringUtils.isNotBlank(userId)){
                UserInfo userInfo=new UserInfo();
                userInfo.setId(userId);
                userInfo.setUserName("firstName");
                userInfo.setLoginId("152013303300");
                return  userInfo;
            }
            return null;
        }
    }
    

      

    ps:注意有使用 @RequestBody和其它**注解的参数,自定义参数解析器不执行,因为spring针对参数解析器有些默认的解析器,当遇到这些默认解析器会优先执行,并不在执行后续自定义解析器

    二、可以使用自定义注解 用于标示哪些参数需要解析处理

    参照:https://blog.csdn.net/u010675669/article/details/91501599

  • 相关阅读:
    我的插件架构
    .net 处理图片亮度
    封装自己的对称加密模块
    漏洞无处不在之窃取你的QQ信息
    写自己的自动升级模块
    抓到一只网马,发文顺便鄙视下360
    .net 3.5的Socket异步完成端口
    检测本机是否登录了指定QQ账号
    C++/CLR写的Data Blocks
    修改的Vista风格多功能日历Demo
  • 原文地址:https://www.cnblogs.com/liyanbofly/p/15821003.html
Copyright © 2020-2023  润新知