我正在配置我的Spring MVC 3.1.1应用程序,如下所述。记录显示在'MyInterceptor.preHandle'之前调用'MyArgumentResolver.resolveArgument'。当在旧时配置中使用它们(使用明确定义的AnnotationMethodHandlerAdapter bean等)时,它们被调用,反之亦然。我读到了< mvc:annotation-driven>在某种程度上是关键的,因为它的配置不补充mvc:namespace的其他设置。我面临同样的问题吗?
<mvc:annotation-driven>
<mvc:message-converters>
...
</mvc:message-converters>
<mvc:argument-resolvers>
<bean class="[...].MyArgumentResolver"/>
</mvc:argument-resolvers>
</mvc:annotation-driven>
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/home/**" />
<bean class="[...].MyInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
非常感谢!
答案 0 :(得分:8)
Spring 3.1 with&lt; mvc:annotation-driven&gt;使用一组不同的类来处理请求 - 例如,AnnotationMethodHandlerAdapter被RequestMappingHandlerAdapter替换。您可以在此处详细了解:http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-31-vs-30
为了正确使用这些类,他们添加了一个新的HandlerMethodArgumentResolver,取代旧的WebArgumentResolver接口。但是,我相信Spring会自动尝试通过将它们包装在AbstractWebArgumentResolverHandlerAdapter中来“升级”旧的WebArgumentResolvers,这是我在升级过程中看到的行为。 AbstractWebArgumentResolverHandlerAdapter的JavaDoc说:
注意:此类是为了向后兼容而提供的。但是,建议将WebArgumentResolver重写为HandlerMethodArgumentResolver。由于supportsParameter(org.springframework.core.MethodParameter)只能通过实际解析值来实现,然后检查结果不是WebArgumentResolver#UNRESOLVED ...
在单步执行代码之后,我认为在您的情况下可能发生的事情是新类在拦截器中执行preHandle之前调用supportsParameter函数,但AbstractWebArgumentResolverHandlerAdapter的实现实际调用resolveArgument方法并检查'UNRESOLVED '作为返回类型,以确定参数解析器是否支持给定的参数,这将使它们的外观不按顺序调用。
我怀疑如果你重写你的参数解析器来实现新的HandlerMethodArgumentResolver接口,它将解决你的问题。