Spring MVC:为什么这个<mvc:interceptors>声明有效,但传统的XML不起作用?



我试图在Spring MVC中添加一些HandlerInterceptorAdaptors到我的所有控制器/动作。我将这些添加到servlet XML文件中。

我不明白的是,为什么我下面的<mvc:interceptors>块正在工作,而不是传统的DefaultAnnotationHandlerMapping bean声明。

下面是正在工作的XML:

<mvc:interceptors>
    <bean name="interceptor1" class="com.foo.bar" />
    <bean name="interceptor2" class="com.foo.bar2" />
</mvc:interceptors>



这是我无法工作的XML:

<bean name="interceptor1" class="com.foo.bar" />
<bean name="interceptor2" class="com.foo.bar2" />
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="order" value="0" />
    <property name="interceptors">
        <list>
            <ref bean="interceptor1"/>
            <ref bean="interceptor2"/>
        </list>
    </property>
</bean>

我认为春天会自动捡起我的类型DefaultAnnotationHandlerMapping的bean,但这似乎不是情况。

请注意,我用@Controller注释了我所有的控制器类,并用@RequestMapping注释了控制器中的方法。

任何想法吗?

Spring实际上为每个bean (org.springframework.web.servlet.handler.MappedInterceptor)构建了一个"MappedInterceptor"。

当我想了解Spring NamespaceHandler时,我发现查看源代码(NamespaceHandler和BeanDefinitionParser)是至关重要的。

MvcNamespaceHandler指向了这个InterceptorsBeanDefinitionParser…

http://javasourcecode.org/html/open-source/spring/spring-3.0.5/org/springframework/web/servlet/config/InterceptorsBeanDefinitionParser.java.html

这表明你应该为每个'拦截器'构建一个bean,有点像这样…

<bean name="interceptor1" class="com.foo.bar" />
<bean name="interceptor2" class="com.foo.bar2" />
<bean class="org.springframework.web.servlet.handler.MappedInterceptor">
    <constructor-arg index="0">
        <null />
    </constructor-arg>
    <constructor-arg index="1">
        <ref bean="interceptor1"/>
    </constructor-arg>
</bean>
<bean class="org.springframework.web.servlet.handler.MappedInterceptor">
    <constructor-arg index="0">
        <null />
    </constructor-arg>
    <constructor-arg index="1">
        <ref bean="interceptor2"/>
    </constructor-arg>
</bean>

这几乎肯定需要一些修补,但它让你更接近Spring正在做的事情…

试一试,如果第一次不能工作,请仔细查看我上面链接的源代码。

HTH

最新更新