Как зарегистрировать обработчик перехватчиков с помощью Spring mvc 3.0? - PullRequest
18 голосов
/ 12 июля 2010

Это должно быть легко:

<bean id="handlerMapping"
   class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="interceptors">
        <list>
            <ref bean="myInterceptor" />
        </list>
    </property>
</bean>

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

Ответы [ 5 ]

29 голосов
/ 12 июля 2010

По умолчанию Spring регистрирует BeanNameUrlHandlerMapping и DefaultAnnotationHandlerMapping, без каких-либо явных настроек.

Если вы определите свои собственные HandlerMapping бины, то по умолчанию они не будут зарегистрированы, и вы просто получите явно объявленные.

Пока все хорошо.

Проблема возникает, когда вы добавляете <mvc:annotation-driven/> к миксу.Этот также объявляет свой собственный DefaultAnnotationHandlerMapping, который заменяет значения по умолчанию.Однако, если вы также объявите свой собственный, то в итоге вы получите два.Поскольку к ним обращаются в порядке объявления, это обычно означает, что тот, который зарегистрирован <mvc:annotation-driven/>, вызывается первым, а ваш собственный игнорируется.

Было бы лучше, если бы DefaultAnnotationHandlerMapping, зарегистрированный <mvc:annotation-driven/>действовал так же, как и по умолчанию, т. е. если явно объявленные имели приоритет, но это не так, как они написали.

В настоящее время я предпочитаю вообще не использовать <mvc:annotation-driven/>, это слишком запутанно и слишком непредсказуемо, когдасмешивается с другими параметрами конфигурации.На самом деле он не делает ничего особенно сложного, нетрудно или многословно явно добавить то, что он делает для вас, и конечный результат легче понять.

13 голосов
/ 25 мая 2012

Проблема, с которой я столкнулся : тег Spring MVC не подходит для пользовательского определения DefaultAnnotationHandlerMapping.

Почему ..? причина очень хорошо объяснена в ответах выше.

Почему я хотел использовать DefaultAnnotationHandlerMapping ? Я хочу определить перехватчик для каждого моего запроса. перехватчик Spring-Mobile для определения ПОЛЬЗОВАТЕЛЬСКОГО АГЕНТА, мобильного или браузера?

Теперь Из-за этого столкновения аннотации mvc и DefaultAnnotationHandlerMapping я больше не могу использовать DefaultAnnotationHandlerMapping. Проблема сводится к тому, как я могу зарегистрировать мои перехватчики с тегом.

Решение было простым ... но его трудно найти. Разместите его так, чтобы он мог быть полезен другим ищущим решения .. Используйте тег и зарегистрируйте bean-объект-перехватчик в вашем dispathcer-servlet.xml пример :

<mvc:interceptors>
 <!-- This runs for all mappings -->
     <bean  class="main.com.XXX.MobileDeviceResolverHanlderInterceptor"/>
</mvc:interceptors>
9 голосов
/ 12 июля 2010

Причина такого поведения заключается в том, что в контексте приложения существуют два компонента типа 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

Это вне меня, почему это поведение по умолчанию. Я ожидаю ответа от весеннего сообщества.

6 голосов
/ 08 ноября 2012

В моем случае я НЕ могу избавиться от <mvc:annotation-driven/>, так как я использую Джексона для поддержки JSON с помощью аннотации.

Что я пробовал, переместил все мои перехватчики <mvc:interceptors> в отдельный файл "xml" (interceptor-config.xml) и импортировал его из моего x-dispatcher-servlet.xml

<import resource="interceptor-config.xml"/>

Это решает мою проблему и избегает использования по умолчанию DefaultAnnotationHandlerMapping для моего контекста приложения.

Вместо того, чтобы создавать отдельный xml, вы можете копировать / вставлять содержимое перехватчика непосредственно в x-dispatcher-servlet.xml '.1010 *

Вот мой перехватчик:

  <mvc:interceptors> 
         <mvc:interceptor>
             <!-- Intercepting specific URL -->
             <mvc:mapping path="/abc/**" />
             <bean id= "myInterceptor" 
                 class="xx.xxx.xxx.MyInterceptor" />
         </mvc:interceptor>
<mvc:interceptors>
3 голосов
/ 12 июля 2010

В Spring MVC 3.0 вы можете использовать <mvc:interceptors> вместо определения вручную определения обработчика.

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