如何使用 spring mvc 3.0 注册处理程序拦截器?

2022-09-02 19:12:48

这应该很容易:

<bean id="handlerMapping"
   class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="interceptors">
        <list>
            <ref bean="myInterceptor" />
        </list>
    </property>
</bean>

但这样就不会调用拦截器。


答案 1

默认情况下,Spring 将注册一个 、和一个 ,而无需任何显式配置。BeanNameUrlHandlerMappingDefaultAnnotationHandlerMapping

如果您定义了自己的bean,则不会注册默认的bean,而您只会获得显式声明的bean。HandlerMapping

目前为止,一切都好。

当您添加到组合中时,问题就来了。这也声明了它自己的 ,它取代了默认值。但是,如果您也声明自己的一个,那么您最终会得到两个。由于它们是按声明顺序协商的,这通常意味着注册的那个首先被调用,而你自己的那个被忽略。<mvc:annotation-driven/>DefaultAnnotationHandlerMapping<mvc:annotation-driven/>

如果注册的 by 像默认的一样,即如果明确声明的优先,那就更好了,但这不是他们写它的方式。DefaultAnnotationHandlerMapping<mvc:annotation-driven/>

我目前的偏好是根本不使用,它太混乱了,而且与其他配置选项混合时太不可预测。它并没有真正做任何特别复杂的事情,明确添加它为你做的东西并不困难或冗长,最终结果更容易遵循。<mvc:annotation-driven/>


答案 2

我面临的问题:Spring MVC标签与DefaultAnnotationHandlerMapping的自定义定义不符。

为什么。。?原因在上面的答案中得到了很好的解释。

为什么我想使用DefaultAnnotationHandlerMapping?我想为我的每个请求定义一个拦截器。一个 Spring-Mobile 拦截器,用于确定用户代理。手机还是浏览器?

现在由于mvc注释DefaultAnnotationHandlerMapping的冲突,我不能再使用DefaultAnnotationHandlerMapping了。问题归结为如何使用标记注册我的拦截器。

解决方案很简单...但很难找到。发布它,以便它可以对其他解决方案寻求者有所帮助。使用标记并在 dispathcer-servlet 中注册拦截器 bean.xml示例

<mvc:interceptors>
 <!-- This runs for all mappings -->
     <bean  class="main.com.XXX.MobileDeviceResolverHanlderInterceptor"/>
</mvc:interceptors>

推荐