Включение аннотаций Spring MVC при сохранении ранее существующих сопоставлений XML - PullRequest
5 голосов
/ 26 февраля 2011

Я работаю над приложением, которое было разработано в Spring 2.5 с использованием сопоставлений XML. Недавно мы обновили JARS до Spring 3.0, а также добавили сканирование некоторых компонентов, пытаясь использовать новые функции MVC Spring 3.0, сохраняя при этом наши существующие сопоставления XML.

Однако, если мы добавим следующее, чтобы включить аннотации sping mvc

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

    <!-- The following is the new XML configuration that we have tried to add -->
    <mvc:annotation-driven/>

    <!-- ... old XML mappings -->

</beans>

Тогда Spring ищет только контроллеры, аннотированные @Controller и нашими старыми XML-отображения, похоже, игнорируются. Является ли единственным решением этой проблемы то, что нам нужно обновить все наши старые XML-отображения, чтобы они основывались на аннотациях (непростая задача), или есть какое-то другое решение?

Один из примеров наших старых XML-отображений выглядит следующим образом:

<bean id="loginController" class="com.app.controller.login.LoginController">
        <property name="loginService" ref="loginService"/>
</bean>

LoginController расширяет SimpleFormController. Многие другие наши старые контроллеры либо расширяют SimpleFormController или MultiActionController.

И вот как наши контроллеры отображаются.

     <bean id="urlMapping"
          class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/login">loginController</prop>
...

Ответы [ 3 ]

3 голосов
/ 26 февраля 2011

Я почти уверен, что это одно или другое для отображения Controller , но функции, основанные на аннотациях, такие как @RequestParam, все равно должны работать, если у вас есть следующая настройка компонента ...

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>

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

У меня есть сомнения, что вы можете определять обработчики отображений URL как в XML, так и в аннотациях, поскольку только один маппер может использоваться контекстом сервлета, а это будет означать, что ваши аннотации и сопоставление XML должны будут выравниваться точно.

2 голосов
/ 27 февраля 2011

Используйте

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>

Это позволит вам использовать аннотированные обработчики @RequestMapping вместе с настроенными обработчиками XML. Это было взято из документации API:

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

Я бы не использовал директивы пространства имен (например, mvc: annotation-driven) при попытке смешать и сопоставить XML-конфигурацию Spring MVC и конфигурацию аннотации. На самом деле, я стараюсь избегать директив пространства имен все вместе. Они плохо документированы и всегда менее эффективны, чем простое определение bean-компонентов непосредственно в вашей конфигурации XML. Кроме того, директивы пространства имен, как правило, обещают много («просто поместите это в свой XML-конфиг, и все будет работать»), но не доставляют, потому что не всегда понятно, как они работают, и это делает отладчик очень трудным.

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

0 голосов
/ 26 февраля 2011

Вы пробовали

<context:annotation-config />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...