Как включить сопоставление Spring 3.0 MappingJacksonHttpMessageConverter с @ResponseBody И контроллером до Spring-3.0 SimpleUrlHandlerMapping вместе? - PullRequest
1 голос
/ 26 мая 2011

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

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

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

Более подробно, у меня есть существующий Springвеб-приложение, которое включает в себя множество контроллеров pre-Spring-3.0.Они реализуют Контроллер и отображаются явно с помощью компонента 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 через Джексона - вызовам 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>     

Проблема в том, что теперь мои явные отображения, определенные в бине 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)

Эти отображения все еще появляются в моем журнале при запуске-up (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 есть какое-то взаимодействие, до которого я не дошёл.

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

1 Ответ

2 голосов
/ 27 мая 2011

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

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

Так что добавьте это явно:

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

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

<bean
    class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter">
</bean>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...