Как включить Spring 3.0 MappingJacksonHttpMessageConverter с @ResponseBody и контроллером SimpleUrlHandlerMapping до Spring 3.0 вместе?

Как следует из названия, я пытаюсь и не могу заставить следующую комбинацию работать в Spring 3.0:

  • контроллеры до Spring 3.0, сопоставленные с SimpleUrlHandlerMapping, и,
  • @Controller Spring-3.0, использующий MappingJacksonHttpMessageConverter и @ResponseBody для возврата JSON.

Все части работают - кроме того, когда они собраны вместе!

Более подробно, у меня есть существующее веб-приложение Spring, которое включает в себя множество контроллеров до Spring-3.0. Они реализуют контроллер и явно отображаются с помощью bean-компонента SimpleUrlHandlerMapping. (Таким образом, одно из решений - изменить их все на стиль @Controller). То же самое веб-приложение (DispatcherServlet) также поддерживает несколько новых контроллеров, аннотированных с помощью @Controller.

Моя конфигурация bean включает в себя следующее, и все хорошо:

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

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

Теперь я добавляю к новому контроллеру, аннотированному с помощью @Controller и @RequestMapping, использование MappingJacksonHttpMessageConverter, чтобы с помощью @ResponseBody некоторые из моих методов могли возвращать JSON через вызовы Jackson — в Ajax. Опять все хорошо:

<!-- to generate JSON responses using Jackson (without using <mvc:annotation-driven/>) -->  
<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
      <list>
        <ref bean="jacksonMessageConverter"/>
      </list>
    </property>
</bean>     

Проблема в том, что теперь мои явные сопоставления, определенные в bean-компоненте SimpleUrlHandlerMapping, больше не работают:

[http-8081-Processor25] ERROR org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/mayapp].[springapp]  - Servlet.service() for servlet springapp threw exception
javax.servlet.ServletException: No adapter for handler [com.mycom.controller.mySpring25Controller ...]: Does your handler implement a supported interface like Controller?
    at org.springframework.web.servlet.DispatcherServlet.getHandlerAdapter(DispatcherServlet.java:985)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:773)

Эти сопоставления по-прежнему появляются в моем журнале при запуске (SimpleUrlHandlerMapping — сопоставленный URL-адрес... и т. д.), но, очевидно, теперь каким-то образом нарушены.

INFO org.springframework.web.servlet.handler.SimpleUrlHandlerMapping  - Mapped URL path [/path/name.ext] onto handler [com.mycom.controller.mySpring25Controller ....]

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

Кому-нибудь интересна проблема? Инсайт с благодарностью получен!


person user598656    schedule 26.05.2011    source источник


Ответы (1)


Разместите и вы найдете (задержка на 8 часов из-за отсутствия репутации)!

Согласно сообщению Нет адаптера для исключения обработчика ответ, по-видимому, заключается в том, что явное определение AnnotationMethodHandlerAdapter убирает неявный SimpleControllerHandlerAdapter, который ранее удовлетворял сопоставлениям SimpleUrlHandlerMapping.

Поэтому добавьте его явно:

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

И у нас все хорошо, хотя в то же время вам, возможно, также потребуется ввести явную замену неявного HttpRequestHandlerAdapter, который также сдулся:

<bean
    class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter">
</bean>
person user598656    schedule 27.05.2011