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

时间:2010-07-12 17:23:54

标签: java spring spring-mvc

应该很容易:

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

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

5 个答案:

答案 0 :(得分:29)

默认情况下,Spring会注册BeanNameUrlHandlerMappingDefaultAnnotationHandlerMapping,而不需要任何显式配置。

如果您定义了自己的HandlerMapping bean,那么默认的bean将不会被注册,您将只获得明确声明的bean。

到目前为止,非常好。

<mvc:annotation-driven/>添加到混音时会出现问题。此声明自己的DefaultAnnotationHandlerMapping,它取代了默认值。但是,如果您也声明自己的那个,那么最终会有两个。由于他们是按照声明的顺序查询的,这通常意味着<mvc:annotation-driven/>注册的人首先被调用,而你自己的人被忽略。

如果由DefaultAnnotationHandlerMapping注册的<mvc:annotation-driven/>表现得像默认值,那就更好了,即如果明确声明的那些优先,但这不是他们写的方式。

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

答案 1 :(得分:13)

我遇到的问题:Spring MVC标记与DefaultAnnotationHandlerMapping的自定义定义不相符。

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

为什么我要使用DefaultAnnotationHandlerMapping ?我想为我的每个请求定义一个拦截器。用于确定USER AGENT..mobile或浏览器的Spring-Mobile拦截器?

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

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

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

答案 2 :(得分:9)

此行为的原因是应用程序上下文中存在两个类型为org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping的bean。 Spring解决了这两个问题,但只问第一个拦截器。要解决此问题,应将以下init参数设置为DispatcherServlet

<init-param>
    <param-name>detectAllHandlerMappings</param-name>
    <param-value>false</param-value>
</init-param>

这使得调度程序servlet仅使用handlerMapping中定义的x-servlet.xml

除此之外,为什么这是默认行为。我期待着春天社区的回答。

答案 3 :(得分:6)

在我的情况下,我无法摆脱<mvc:annotation-driven/>,因为我正在使用杰克逊使用注释来支持json。

我尝试了什么,将我的所有拦截器<mvc:interceptors>移动到单独的“xml”文件(interceptor-config.xml)中并从我的x-dispatcher-servlet.xml导入它

<import resource="interceptor-config.xml"/>

它解决了我的问题并避免默认的'DefaultAnnotationHandlerMapping'bean我的应用程序上下文。

您可以直接在'x-dispatcher-servlet.xml'中复制/粘贴拦截器内容,而不是创建单独的'xml'。

以下是我的拦截器:

  <mvc:interceptors> 
         <mvc:interceptor>
             <!-- Intercepting specific URL -->
             <mvc:mapping path="/abc/**" />
             <bean id= "myInterceptor" 
                 class="xx.xxx.xxx.MyInterceptor" />
         </mvc:interceptor>
<mvc:interceptors>

答案 4 :(得分:3)

在Spring MVC 3.0中,您可以使用<mvc:interceptors>而不是手动定义处理程序映射。