#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 …
Это указывает на то, что вы должны создавать компонент для каждого «перехватчика», немного похожий на этот…
<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. Извините, я не использовал ни того, ни другого, я просто указал вам на несоответствие в вашем подходе