【问题标题】:Spring Web MVC 3.1.1 argument resolver called before interceptor在拦截器之前调用 Spring Web MVC 3.1.1 参数解析器
【发布时间】:2012-04-02 12:12:13
【问题描述】:

我正在配置我的 Spring MVC 3.1.1 应用程序,总结如下。日志显示在“MyInterceptor.preHandle”之前调用了“MyArgumentResolver.resolveArgument”。当在旧式配置中使用两者时(使用明确定义的 AnnotationMethodHandlerAdapter bean 等),它们会被调用,反之亦然。我读到 有点关键,因为它的配置不补充 mvc: 命名空间的其他设置。我是否面临同样的问题?

<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>

非常感谢!

【问题讨论】:

    标签: spring spring-mvc


    【解决方案1】:

    带有 的 Spring 3.1 使用一组不同的类来处理请求 - 例如,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 会自动尝试“升级”旧的 WebArgumentResolvers,方法是将它们包装在 AbstractWebArgumentResolverHandlerAdapter 中,这是我在升级过程中看到的行为。 AbstractWebArgumentResolverHandlerAdapter 的 JavaDoc 说:

    注意:提供此类是为了向后兼容。但是,建议将 WebArgumentResolver 重写为 HandlerMethodArgumentResolver。由于supportsParameter(org.springframework.core.MethodParameter)只能通过实际解析值然后检查结果是不是WebArgumentResolver#UNRESOLVED来实现...

    在单步执行代码后,我认为您的情况可能是新类在拦截器中执行 preHandle 之前调用了 supportsParameter 函数,但 AbstractWebArgumentResolverHandlerAdapter 的实现实际上调用了 resolveArgument 方法并检查了 'UNRESOLVED ' 作为返回类型,以确定参数解析器是否支持给定参数,这会使它们看起来被无序调用。

    我怀疑如果你重写你的参数解析器来实现新的 HandlerMethodArgumentResolver 接口,它会解决你的问题。

    【讨论】:

    • 非常感谢 roblg。将接口更改为HandlerMethodArgumentResolver 解决了这个问题。我的WebArgumentResolver 期望拦截器设置请求属性并在 attr 时抛出异常。不见了。如您所说,在拦截器的 preHandle 之前调用了 resolveArgument 以检查解析器是否适用。
    猜你喜欢
    • 2013-04-10
    • 1970-01-01
    • 1970-01-01
    • 2014-05-19
    • 2020-01-21
    • 2023-03-18
    • 1970-01-01
    • 2014-11-25
    • 2016-02-02
    相关资源
    最近更新 更多