Java 将Spring 3.1与RequestMappingHandlerAdapter一起使用时出现默认构造函数错误
我有一个自定义参数解析器Java 将Spring 3.1与RequestMappingHandlerAdapter一起使用时出现默认构造函数错误,java,spring,spring-3,spring-annotations,spring-test,Java,Spring,Spring 3,Spring Annotations,Spring Test,我有一个自定义参数解析器SecurityRequestParametersArgumentResolver,它在Spring 3.0.7中工作,但在Spring 3.1.2中失败。堆栈跟踪和测试驱动程序代码如下所示。 当我查看堆栈跟踪时,似乎没有调用SecurityRequestParametersArgumentResolver.resolve()。相反,我在堆栈跟踪中看到了HandlerMethodArgumentResolverComposite.resolve 建议 我已经更新了java
SecurityRequestParametersArgumentResolver
,它在Spring 3.0.7中工作,但在Spring 3.1.2中失败。堆栈跟踪和测试驱动程序代码如下所示。当我查看堆栈跟踪时,似乎没有调用
SecurityRequestParametersArgumentResolver.resolve()
。相反,我在堆栈跟踪中看到了HandlerMethodArgumentResolverComposite.resolve
建议
我已经更新了java代码以使用HandlerMethodArgumentResolver
(它是3.0.7版本中的AnnotationMethodHandlerAdapter
),但是在执行运行时集成测试时会出现此堆栈跟踪:
Caused by: java.lang.NoSuchMethodException: xyz.security.web.SecurityRequestParameters.<init>()
at java.lang.Class.getConstructor0(Unknown Source)
at java.lang.Class.getDeclaredConstructor(Unknown Source)
at org.springframework.beans.BeanUtils.BeanUtils.BeanUtils.instantiateClass(Class<T>) line: 104
ServletModelAttributeMethodProcessor(ModelAttributeMethodProcessor).createAttribute(String, MethodParameter, WebDataBinderFactory, NativeWebRequest) line: 132
ServletModelAttributeMethodProcessor.createAttribute(String, MethodParameter, WebDataBinderFactory, NativeWebRequest) line: 81
ServletModelAttributeMethodProcessor(ModelAttributeMethodProcessor).resolveArgument(MethodParameter, ModelAndViewContainer, NativeWebRequest, WebDataBinderFactory) line: 103
HandlerMethodArgumentResolverComposite.resolveArgument(MethodParameter, ModelAndViewContainer, NativeWebRequest, WebDataBinderFactory) line: 75
ServletInvocableHandlerMethod(InvocableHandlerMethod).getMethodArgumentValues(NativeWebRequest, ModelAndViewContainer, Object...) line: 156
ServletInvocableHandlerMethod(InvocableHandlerMethod).invokeForRequest(NativeWebRequest, ModelAndViewContainer, Object...) line: 117
ServletInvocableHandlerMethod.invokeAndHandle(NativeWebRequest, ModelAndViewContainer, Object...) line: 96
RequestMappingHandlerAdapter.invokeHandlerMethod(HttpServletRequest, HttpServletResponse, HandlerMethod) line: 617
RequestMappingHandlerAdapter.handleInternal(HttpServletRequest, HttpServletResponse, HandlerMethod) line: 578
RequestMappingHandlerAdapter(AbstractHandlerMethodAdapter).handle(HttpServletRequest, HttpServletResponse, Object) line: 80
SecuritySystemTestStartUp$1(DispatcherServlet).doDispatch(HttpServletRequest, HttpServletResponse) line: 923
SecuritySystemTestStartUp$1(DispatcherServlet).doService(HttpServletRequest, HttpServletResponse) line: 852
SecuritySystemTestStartUp$1(FrameworkServlet).processRequest(HttpServletRequest, HttpServletResponse) line: 882
SecuritySystemTestStartUp$1(FrameworkServlet).doPost(HttpServletRequest, HttpServletResponse) line: 789
SecuritySystemTestStartUp$1(HttpServlet).service(HttpServletRequest, HttpServletResponse) line: 637
SecuritySystemTestStartUp$1(HttpServlet).service(ServletRequest, ServletResponse) line: 717
SecurityExternalAPISystemTest.testEncrypt() line: 86
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: not available
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: not available
Method.invoke(Object, Object...) line: not available
FrameworkMethod$1.runReflectiveCall() line: 44
FrameworkMethod$1(ReflectiveCallable).run() line: 15
FrameworkMethod.invokeExplosively(Object, Object...) line: 41
InvokeMethod.evaluate() line: 20
RunBeforeTestMethodCallbacks.evaluate() line: 74
RunAfterTestMethodCallbacks.evaluate() line: 83
SpringRepeat.evaluate() line: 72
SecuritySpringJUnitRunner(SpringJUnit4ClassRunner).runChild(FrameworkMethod, RunNotifier) line: 231
SecuritySpringJUnitRunner(BlockJUnit4ClassRunner).runChild(Object, RunNotifier) line: 49
ParentRunner$3.run() line: 193
ParentRunner$1.schedule(Runnable) line: 52
SecuritySpringJUnitRunner(ParentRunner<T>).runChildren(RunNotifier) line: 191
ParentRunner<T>.access$000(ParentRunner, RunNotifier) line: 42
ParentRunner$2.evaluate() line: 184
RunBefores.evaluate() line: 28
RunBeforeTestClassCallbacks.evaluate() line: 61
RunAfterTestClassCallbacks.evaluate() line: 71
SecuritySpringJUnitRunner(ParentRunner<T>).run(RunNotifier) line: 236
SecuritySpringJUnitRunner(SpringJUnit4ClassRunner).run(RunNotifier) line: 174
JUnit4TestClassReference(JUnit4TestReference).run(TestExecution) line: 50
TestExecution.run(ITestReference[]) line: 38
RemoteTestRunner.runTests(String[], String, TestExecution) line: 467
RemoteTestRunner.runTests(TestExecution) line: 683
RemoteTestRunner.run() line: 390
RemoteTestRunner.main(String[]) line: 197
参数解析器(与Spring 3.0.7兼容)用于后处理AfterInitialization。参数解析器的代码摘录如下所示
公共类AnnotationMethodHandlerBeanPostProcessor扩展实例化WareBeanPostProcessorAdapter
{
@Autowired
公共注释方法HandlerBeanPostProcessor(最终SecurityRequestParametersArgumentResolver解析程序)
{
超级();
_分解器=分解器;
}
@凌驾
公共对象后处理后初始化(最终对象bean、最终字符串bean名称)
{
if(RequestMappingHandlerAdapter的bean实例)
{
最终的RequestMappingHandlerAdapter=(RequestMappingHandlerAdapter)bean;
最终列表>消息转换器=
requestMappingHandlerAdapter.getMessageConverters();
requestResponseBodyMethodProcessor=新的requestResponseBodyMethodProcessor(messageConverters);
}
返回requestResponseBodyMethodProcessor;
}
}
最后。。。以下是Spring配置中的注释驱动标记
<mvc:annotation-driven>
<mvc:argument-resolvers>
<bean class="com.trgr.cobalt.security.web.SecurityRequestParametersArgumentResolver" />
</mvc:argument-resolvers>
</mvc:annotation-driven>
鉴于您的意见,我认为您必须将您的
支持参数更改为以下内容:
public boolean supportsParameter(MethodParameter parameter)
{
return parameter.getParameterAnnotation(ParamResolver.class)!=null
}
你能展示一下你是如何在Spring mvc上注册HandlerMethodArgumentResolver的以及ArgumentResolver alsoBiju的代码的吗?我更新了描述以包括部分Spring配置(xml)和大部分ArgumentResolver。注释驱动的标记是。。。我看到您的supports方法依次依赖于RequestResponseBodyMethodProcessor
。supports()…它要求使用@RequestBody
注释属性。您能否确认您的参数具有@RequestBody
注释?以下是参数注释。“解析”应应用于ParamResolver,而不是RequestBody。>\@RequestMapping(value=“/v1/encrypt/{key}”,method=RequestMethod.POST)>\@ResponseBody>public cryptographicsresource createEncryptResource(\@paramrolver final SecurityRequestParameters,>\@PathVariable(“key”)final String key,\@RequestBody final byte[]requestPayload)>{>..>>返回_securityService.encrypt(参数、密钥、请求);>}谢谢,我做了这个更改,但它没有解决这个问题[无论如何:-)]
<bean id="SecurityRequestParametersArgumentResolver"
class="xyz.security.web.SecurityRequestParametersArgumentResolver">
<constructor-arg ref="CredentialsManager" />
<constructor-arg ref="TokenService" />
</bean>
<!-- A bean post-processor that registers the SecurityRequestParametersArgumentResolver. -->
<bean class="xyz.security.web.AnnotationMethodHandlerBeanPostProcessor">
<constructor-arg index="0" ref="SecurityRequestParametersArgumentResolver" />
</bean>
private final CredentialsManager _credentialsManager;
private final TokenService _tokenService;
private RequestResponseBodyMethodProcessor requestResponseBodyMethodProcessor = null;
/* For the component scan... */
SecurityRequestParametersArgumentResolver()
{
this(null, null);
}
public SecurityRequestParametersArgumentResolver(final CredentialsManager credentialsManager,
final TokenService tokenService)
{
super();
_credentialsManager = credentialsManager;
_tokenService = tokenService;
}
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception
{
if (parameter != null && SecurityRequestParameters.class.equals(parameter.getParameterType()))
{
String productName = webRequest.getHeader(HttpHeader.PRODUCT_CONTAINER_HEADER.value());
...
return new SecurityRequestParameters(credentials, contentType, acceptType, dataEncoding,
sessionIdentifier, remoteIpAddress, securityProductName);
}
return new Object();
}
public boolean supportsParameter(MethodParameter parameter)
{
return getRequestResponseBodyMethodProcessor().supportsParameter(parameter);
}
private RequestResponseBodyMethodProcessor getRequestResponseBodyMethodProcessor()
{
if (requestResponseBodyMethodProcessor == null)
{
List<HttpMessageConverter<?>> messageConverters =
requestMappingHandlerAdapter.getMessageConverters();
requestResponseBodyMethodProcessor = new RequestResponseBodyMethodProcessor(messageConverters);
}
return requestResponseBodyMethodProcessor;
}
<mvc:annotation-driven>
<mvc:argument-resolvers>
<bean class="com.trgr.cobalt.security.web.SecurityRequestParametersArgumentResolver" />
</mvc:argument-resolvers>
</mvc:annotation-driven>
public boolean supportsParameter(MethodParameter parameter)
{
return parameter.getParameterAnnotation(ParamResolver.class)!=null
}