Подтвердить что ты не робот

Как зарегистрировать перехватчики обработчиков с помощью 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>

но таким образом перехватчик не вызывается.

4b9b3361

Ответ 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> вместо ручного определения отображения обработчика.