Spring MVC: почему это объявление работает, но не традиционный XML?

#java #spring #spring-mvc #dependency-injection

#java #spring #spring-mvc #внедрение зависимости

Вопрос:

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

Чего я не понимаю, так это почему <mvc:interceptors> приведенный ниже блок работает, но не традиционное объявление bean с 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:

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 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

Комментарии:

1. Я использую Spring 3.0, я предполагаю, что MappedInterceptor это способ работы с Spring 3? Вместо сопоставления с обработчиком в более старых версиях spring?

2. Извините, я не использовал ни того, ни другого, я просто указал вам на несоответствие в вашем подходе