Проблема с использованием Spring 3 MVC - PullRequest
1 голос
/ 15 ноября 2010

У меня есть все фляги в среде Spring 3 на моем classpath, и я хотел добавить Spring 3 mvc в конфигурацию моего приложения.Первоначально у меня был следующий XML.

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


    <context:annotation-config/>
    <bean class="com.apppackage.app.config.AppContextConfig" />

    <!-- Autoscan for @Controller type controllers -->
    <context:component-scan base-package="com.apppackage.app.controller" /> 

Это всего лишь фрагмент соответствующей информации.Мое приложение работало нормально с вышеуказанным XML, но затем я добавил Spring 3 MVC в конфигурацию со следующими изменениями:

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

    <context:annotation-config/>

    <mvc:annotation-driven />
    <bean class="com.apppackage.app.config.AppContextConfig" />

    <!-- Autoscan for @Controller type controllers -->
    <context:component-scan base-package="com.apppackage.app.controller" />

Теперь у меня проблемы со всем приложением.Spring, кажется, не является бобами Autowiring, как это было раньше.Я также получил следующую ошибку на моих контроллерах:

No adapter for handler [com.apppackage.app.controller.login.LoginController@274b9691]: Does your handler implement a supported interface like Controller?

Ответы [ 4 ]

3 голосов
/ 15 ноября 2010

В дополнение к ответу Скаффмана: вы можете включить контроллеры старого стиля, не удаляя <mvc:annotation-driven>, объявив сопоставления обработчиков старого стиля и адаптеры обработчиков вручную:

<bean class = "org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
<bean class = "org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />

Пояснение:

Когда DispatcherServlet не может найти HandlerMapping s и HandlerAdapter s, объявленные в контексте, он регистрирует сопоставления по умолчанию (BeanNameUrlHandlerMapping и DefaultAnnotationHandlerMapping) и адаптеры (HttpRequestHandlerAdapter, SimpleControllerHandlerAdapter и AnnotationMethodHandlerAdapter), поэтому в простом случае все работает без явной настройки. Однако если вы явно объявляете некоторые сопоставления или адаптеры, настройки по умолчанию не применяются, поэтому, если вам нужны другие сопоставления и адаптеры, вы должны также объявить их явно.

Теперь <mvc:annotation-driven> явно объявляет DefaultAnnotationHandlerMapping и AnnotationMethodHandlerAdapter, эффективно отключая другие сопоставления и адаптеры по умолчанию, поэтому вам нужно объявить их вручную.

1 голос
/ 31 августа 2012

Вдохновленный ответом axtavt, я удалил это из своего конфига mvc, и это привело меня к ошибке «Нет адаптера для обработчика ..»:

<bean id="annotationMapper" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
1 голос
/ 15 ноября 2010

Когда вы добавляете <mvc:annotation-driven /> в свой контекст, вы фактически отключаете поддержку иерархии типов Controller старого стиля.

Сообщения об ошибках подсказывают мне, что LoginController не является аннотированным контроллером, но является подтипом интерфейса Controller.

Если вы не хотите проводить рефакторинг LoginController, удалите <mvc:annotation-driven /> из своего контекста. Если вы не используете проверку JSR-303 или сериализацию JSON, вам все равно это не нужно

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