Spring Web MVC 3.1.1参数解析器在拦截器之前调用

时间:2012-04-02 12:12:13

标签: spring spring-mvc

我正在配置我的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>

非常感谢!

1 个答案:

答案 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接口,它将解决你的问题。