Как зарегистрировать перехватчики обработчиков с помощью spring mvc 3.0?
Это должно быть легко:
<bean id="handlerMapping"
class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="interceptors">
<list>
<ref bean="myInterceptor" />
</list>
</property>
</bean>
но таким образом перехватчик не вызывается.
Ответы
Ответ 1
По умолчанию Spring будет зарегистрировать BeanNameUrlHandlerMapping
и a DefaultAnnotationHandlerMapping
без какой-либо явной конфигурации.
Если вы определяете свой собственный HandlerMapping
beans, то по умолчанию они не будут зарегистрированы, и вы просто получите явно объявленные.
До сих пор так хорошо.
Проблема возникает, когда вы добавляете <mvc:annotation-driven/>
в микс. Это также объявляет свой собственный DefaultAnnotationHandlerMapping
, который заменяет значения по умолчанию. Однако, если вы также объявите свой собственный, то вы получите два. Так как их проконсультируют в порядке объявления, это обычно означает, что тот, который зарегистрирован <mvc:annotation-driven/>
, сначала вызывается, а ваш собственный игнорируется.
Было бы лучше, если бы DefaultAnnotationHandlerMapping
, зарегистрированный <mvc:annotation-driven/>
, действовал как по умолчанию, то есть если явно объявленные имеют приоритет, но это не так, как они его написали.
В настоящее время я предпочитаю не использовать <mvc:annotation-driven/>
вообще, это слишком запутанно и слишком непредсказуемо, когда вы смешиваетесь с другими параметрами конфигурации. Это на самом деле не делает ничего особенно сложного, это не сложно или многословно, чтобы явно добавить материал, который он делает для вас, и конечный результат легче выполнить.
Ответ 2
Проблема, с которой я столкнулся: Spring Тэг MVC плохо сочетается с пользовательским определением DefaultAnnotationHandlerMapping.
Почему..? причина очень хорошо объясняется в ответах выше.
Почему я хотел использовать DefaultAnnotationHandlerMapping? Я хочу определить перехватчик для каждого моего запроса. a Spring -Мобильный перехватчик для определения USER AGENT..mobile или браузера?
Теперь из-за этого столкновения mvc-аннотации и DefaultAnnotationHandlerMapping я больше не могу использовать DefaultAnnotationHandlerMapping.
Проблема сводится к тому, как я могу зарегистрировать свои перехватчики с тегом.
Решение было простым... но трудно найти. Проводя его, чтобы он мог быть полезен другим искателям решений..
Используйте тег и зарегистрируйте перехватчик bean в вашем dispathcer-servlet.xml
пример:
<mvc:interceptors>
<!-- This runs for all mappings -->
<bean class="main.com.XXX.MobileDeviceResolverHanlderInterceptor"/>
</mvc:interceptors>
Ответ 3
Причиной такого поведения является то, что в контексте приложения существуют два beans типа org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
. Spring разрешает два, но запрашивает только первое для перехватчиков. Чтобы исправить это, следующий параметр init должен быть установлен в DispatcherServlet
<init-param>
<param-name>detectAllHandlerMappings</param-name>
<param-value>false</param-value>
</init-param>
Это означает, что сервлет диспетчера использует только handlerMapping
, определенный в x-servlet.xml
Это вне меня, почему это поведение по умолчанию. Я ожидаю ответа от сообщества Spring.
Ответ 4
В моем случае я не могу избавиться от <mvc:annotation-driven/>
, поскольку я использую jackson для поддержки json, используя аннотацию.
Что я пробовал, переместил все перехватчики <mvc:interceptors>
в отдельный файл "xml" (interceptor-config.xml) и импортировал его из моего x-dispatcher-servlet.xml
<import resource="interceptor-config.xml"/>
Он решает мою проблему и избегает использования по умолчанию "DefaultAnnotationHandlerMapping" beans моего контекста приложения.
Вместо создания отдельного "xml" вы можете копировать/вставлять содержимое перехватчика непосредственно в "x-dispatcher-servlet.xml".
Следующий мой перехватчик:
<mvc:interceptors>
<mvc:interceptor>
<!-- Intercepting specific URL -->
<mvc:mapping path="/abc/**" />
<bean id= "myInterceptor"
class="xx.xxx.xxx.MyInterceptor" />
</mvc:interceptor>
<mvc:interceptors>
Ответ 5
В Spring MVC 3.0 вы можете использовать <mvc:interceptors>
вместо ручного определения отображения обработчика.