我正在尝试向Spring MVC中的所有控制器/操作添加一些HandlerInterceptorAdaptor。我将这些添加到我的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>
我认为Spring会自动获取DefaultAnnotationHandlerMapping
类型的bean,但情况似乎并非如此。
请注意,我使用@Controller
注释所有Controller类,并使用@RequestMapping
注释Controller中的方法。
有什么想法吗?
答案 0 :(得分:4)
Spring实际上为每个bean构建了一个“MappedInterceptor”(org.springframework.web.servlet.handler.MappedInterceptor)。
当我想了解Spring NamespaceHandler时,我发现查看源代码(对于NamespaceHandler,然后是BeanDefinitionParser)至关重要。
MvcNamespaceHandler向我指出了这个InterceptorsBeanDefinitionParser ......
这表明你应该为每个'拦截器'构建一个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