с аннотированными контроллерами - PullRequest
5 голосов
/ 26 августа 2011

Мой проект включает старые аннотированные контроллеры вместе с новыми контроллерами на основе аннотаций.

Я использую последние Spring jar (3.0.5) и в моем dispatcher-servlet.xml есть <mvc:annotation-driven />.

Проблема в том, что <mvc:annotation-driven /> заставляет мои запросы (не через анонимные контроллеры bean-компонентов в dispatcher-servlet.xml) сопоставлять запросы моим не аннотированным контроллерам ... каждый раз, когда я направляю запрос Неаннотированный контроллер Я получаю сообщение об ошибке, такое как:

org.springframework.web.servlet.DispatcherServlet noHandlerFound  
WARNING: No mapping found for HTTP request with URI [/some_path/some_page.htm] in DispatcherServlet with name 'dispatcher'

Как сохранить аннотированные контроллеры такими, какие они есть, но сказать Spring, чтобы они распознали их (старый стиль) отображение?

Я ищу решения с минимальным изменением кода Java контроллеров, которые у меня уже есть.

Спасибо!

Ответы [ 2 ]

6 голосов
/ 18 декабря 2011

Я обнаружил, что, взорвав mvc: annotation на основе его фактической замены, было легче понять.

<mvc:annotation-driven /> взрывается до этого:

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="order" value="0" />
</bean>

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="webBindingInitializer">
        <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
            <property name="validator" ref="validator" />
        </bean>
    </property>
    <property name="messageConverters">
        <list>
            <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" />
            <bean class="org.springframework.http.converter.StringHttpMessageConverter" />
            <bean class="org.springframework.http.converter.FormHttpMessageConverter" />
            <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter" />
        </list>
    </property>
</bean>

<!-- Configures a validator for spring to use -->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
    <property name="messageInterpolator">
        <bean class="com.eps.web.spring.validation.SpringMessageSourceMessageInterpolator" />
    </property>
</bean>

<bean id="conversion-service" class="org.springframework.format.support.FormattingConversionServiceFactoryBean" />

Как только магия исчезла, я получил эту ошибку при попытке загрузить «старый» контроллер: javax.servlet.ServletException: No adapter for handler [org.springframework.web.servlet.mvc.ParameterizableViewController@

С этого момента я добавил

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

И все мои старые контроллеры работали.

6 голосов
/ 26 августа 2011

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

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

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

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

Если вы использовали SimpleUrlHandlerMapping, то это должно работать уже.

Вам также необходимо добавить HandlerAdapter обратно в:

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

Не добавляйте это вслепую. Попробуйте их по отдельности и посмотрите, каков минимальный набор для того, чтобы ваши старые контроллеры работали вместе с новыми.

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