You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring 5.3.20升级后如何获取HandlerMethodArgumentResolverComposite实例

问题原因

Spring Framework 5.x 版本调整了RequestMappingHandlerAdapter#getArgumentResolvers()的返回值逻辑:旧版本直接返回内部维护的HandlerMethodArgumentResolverComposite实例,5.x之后该方法仅返回List<HandlerMethodArgumentResolver>类型的解析器集合,不再直接暴露内部的组合对象,因此原代码直接赋值的写法会触发类型不匹配错误。

修复方案

无需强行获取适配器内部的私有组合实例,手动构造HandlerMethodArgumentResolverComposite并填充拿到的解析器列表即可,这也是Spring框架内部使用该组件的标准方式,完全兼容5.3.20版本的API。
修正后的完整代码如下:

Method method = methodNameToMethodObjectCache.get(methodName);

MockHttpServletResponse response = new MockHttpServletResponse();
ServletWebRequest webRequest = new ServletWebRequest(request, response);

DefaultDataBinderFactory binderFactory = new DefaultDataBinderFactory(requestMappingHandlerAdapter.getWebBindingInitializer());

// 获取适配器持有的所有参数解析器
List<HandlerMethodArgumentResolver> resolvers = requestMappingHandlerAdapter.getArgumentResolvers();
// 构造组合解析器实例并添加解析器
HandlerMethodArgumentResolverComposite argumentResolver = new HandlerMethodArgumentResolverComposite();
argumentResolver.addResolvers(resolvers);

LocalVariableTableParameterNameDiscoverer nameDiscoverer = new LocalVariableTableParameterNameDiscoverer();

HandlerMethod handlerMethod = new HandlerMethod(controllerClass, method);
InvocableHandlerMethod requestMethod = new InvocableHandlerMethod(handlerMethod);
requestMethod.setDataBinderFactory(binderFactory);
requestMethod.setHandlerMethodArgumentResolvers(argumentResolver);
requestMethod.setParameterNameDiscoverer(nameDiscoverer);
注意事项
  • 上述写法构造的组合解析器包含所有默认注册、以及自定义添加的参数解析器,参数解析行为和原逻辑完全一致,不会出现功能差异
  • 不要通过反射读取RequestMappingHandlerAdapter的私有字段获取内部的组合实例,这种方式依赖框架内部实现细节,后续版本升级很容易出现兼容问题。

内容的提问来源于stack exchange,提问作者Jeff Cook

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 21:54:21