Spring MVC: Почему работает это объявление <mvc: interceptors>, а не традиционный XML? - PullRequest
2 голосов
/ 29 апреля 2011

Я пытаюсь добавить HandlerInterceptorAdaptor s ко ВСЕМ моим контроллерам / действиям в Spring MVC. Я добавляю их в мой файл сервлета XML.

Что я не понимаю, так это то, почему блок <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 автоматически подберет мой бин типа DefaultAnnotationHandlerMapping, но это не так.

Обратите внимание, что все мои классы контроллеров помечаются @Controller, а методы внутри контроллера - @RequestMapping.

Есть мысли?

1 Ответ

4 голосов
/ 29 апреля 2011

Spring фактически создает один "MappedInterceptor" для каждого компонента (org.springframework.web.servlet.handler.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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...