Как зарегистрировать перехватчики обработчика в пружинном mvc 3.0?

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

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

но этот путь перехватчик не называют.

18
задан Bozho 12 July 2010 в 17:23
поделиться

3 ответа

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

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

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

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

Было бы лучше, если бы DefaultAnnotationHandlerMapping , зарегистрированный , действовал как по умолчанию, то есть если явно объявленные объекты имели приоритет, но это не как они это написали.

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

29
ответ дан 30 November 2019 в 06:02
поделиться

В Spring MVC 3.0 вы можете использовать вместо ручного определения связки обработчиков.

3
ответ дан 30 November 2019 в 06:02
поделиться

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

9
ответ дан 30 November 2019 в 06:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: