Как следует из названия, я пытаюсь и не могу заставить следующую комбинацию работать в 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 есть какое-то взаимодействие, до которого я не дошел.
Кому-нибудь интересна проблема? Инсайт с благодарностью получен!