如何使用@ResponseBody和Spring-3.0控制器SimpleUrlHandlerMapping一起启用Spring 3.0 MappingJacksonHttpMessageConverter?

时间:2011-05-26 13:55:58

标签: spring-mvc jackson

正如标题所示,我正在尝试并且未能在Spring 3.0中使用以下组合:

  • 使用SimpleUrlHandlerMapping和
  • 映射的Spring-3.0之前的控制器
  • Spring-3.0 @Controller使用MappingJacksonHttpMessageConverter和@ResponseBody返回JSON。

所有作品都有效 - 除非放在一起!

更详细地说,我有一个现有的Spring网络应用程序,其中包含许多Spring-3.0之前的控制器。这些实现Controller并使用SimpleUrlHandlerMapping bean显式映射。 (因此,一种解决方案是将它们全部更改为@Controller样式)。同一个web-app(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我的一些方法可以通过Jackson返回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 bean中定义的显式映射不再有效:

[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自动魔术中存在一些相互作用,我没有深入到底。

有趣的问题是谁?洞察得很感激!

1 个答案:

答案 0 :(得分:2)

发帖,你们会发现(由于缺乏声誉而延迟了8个小时)!

根据帖子No adapter for handler exception,答案似乎是显式的AnnotationMethodHandlerAdapter定义消除了之前满足SimpleUrlHandlerMapping映射的隐式SimpleControllerHandlerAdapter。

所以明确添加:

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

我们很好,但与此同时你可能还需要引入隐式HttpRequestHandlerAdapter的明确替代品也被吹走了:

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