Spring 3 <mvc:拦截器>有缺陷?</mvc:拦截器>

时间:2011-09-21 20:07:59

标签: java spring model-view-controller controller spring-3

我有一个Spring 2.5.x应用程序,我正在迁移到Spring 3,只是遇到了一个小问题。

我有一个像这样的处理程序映射:

<bean id="handlerMappings1" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="interceptors">
        <list>
            <ref bean="interceptor1" />
            <ref bean="interceptor2" />
            ....
            <ref bean="interceptorN" />
        </list>
    </property>
    <property name="urlMap">
        <map>
            <entry key="/url1.html" value-ref="controller1" />
            <entry key="/url2.html" value-ref="controller2" />
            ....
            <entry key="/url100.html" value-ref="controller100" />
        </map>
    </property>
</bean>

和另一个像这样:

   <bean id="handlerMappings2" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="urlMap">
            <map>
                <entry key="/urlA.html" value-ref="controllerA" />
                <entry key="/urlB.html" value-ref="controllerB" />
                ....
                <entry key="/urlN.html" value-ref="controllerN" />
            </map>
        </property>
    </bean>

我正在慢慢将@RequestMapping注释替换为<context:component-scan>(基本上注册DefaultAnnotationHandlerMapping)。

在Spring 3中,我看到了<mvc:interceptors>标签,可用于向某些网址添加拦截器,但您只能指定一个拦截器,至少是我看到的from the schema

从我可以看出,我必须为每个拦截器注册其中一个,它将复制我的所有URL多次,因为我有拦截器(我甚至不知道它们将按什么顺序运行)。

另一方面,我无法在DefaultAnnotationHandlerMapping上添加iterceptors,因为它们将针对我用@RequestMapping注释的所有控制器运行,我不希望这样。

那么如何为某些URL指定拦截器是Spring 3,而不重复URL和  根据{{​​1}}注释将URL保存到控制器映射?

2 个答案:

答案 0 :(得分:0)

一种选择是创建一个自定义拦截器,它可以委托给一组注入的拦截器。

答案 1 :(得分:0)

您可以查看springplugins项目中的SelectedAnnotationHandlerMappingIgnoreSelectedAnnotationHandlerMapping类。消息来源有些年头了,但这个想法仍然存在。

创作者的博客上有一个演示文稿:Spring Framework Annotation-based Controller Interceptor Configuration。请务必阅读博文中的评论。