使用 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构