我试图在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