我试图在Spring MVC中向我的所有Controller / Action 添加一些HandlerInterceptorAdaptor。我将它们添加到我的servlet XML文件中。
我不明白的是为什么<mvc:interceptors>下面的代码可以工作,而不是使用的传统bean声明DefaultAnnotationHandlerMapping。
<mvc:interceptors>
DefaultAnnotationHandlerMapping
这是有效的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>
我以为Spring会自动拾取我的type的bean DefaultAnnotationHandlerMapping,但事实并非如此。
请注意,我使用注释了我的所有Controller类@Controller以及Controller中的方法@RequestMapping。
@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的工作…
试试看,如果它不能第一次使用,请仔细阅读上面链接到的源代码。
高温超导