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

一、

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
 * 注册外部的interceptor WebConfig
 */
@Configuration
public class WebConfig implements WebMvcConfigurer {
 
    /**
     * 配置外部HandlerMethodArgumentResolver
     */
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(new HandleFirstArgsRevlover());
    }
}

  

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

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
 * 保存用户信息
 * @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并返回处理后的参数对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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

posted @   xiaoBai1001  阅读(165)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示