如何通过@ResponseBody和Spring 3.0之前的控制器SimpleUrlHandlerMapping一起启用Spring 3.0 MappingJacksonHttpMessageConverter?

问题描述

| 如标题所示,我正在尝试并无法在Spring 3.0中使以下组合正常工作: 使用SimpleUrlHandlerMapping映射的Spring 3.0之前的控制器,以及 Spring 3.0 @Controller,使用MappingJacksonHttpMessageConverter和@ResponseBody返回JSON。 所有部件都可以工作-放在一起时除外! 更详细地讲,我有一个现有的Spring Web应用程序,其中包含许多Spring 3.0之前的控制器。这些实现Controller并使用SimpleUrlHandlerMapping bean显式映射。 (因此,一种解决方案是将它们全部更改为@Controller样式)。相同的Web应用程序(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>
现在,我将使用MappingJacksonHttpMessageConverter添加到带有@Controller和@RequestMapping注释的新控制器中,以便通过@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自动魔术师中有些互动,我还没有深入了解。 有趣的问题有人吗?感激地收到了!     

解决方法

邮政和你们将发现(由于缺乏声誉而延迟了8个小时)! 根据文章“没有用于处理程序异常的适配器”,答案似乎是显式的AnnotationMethodHandlerAdapter定义吹走了以前满足SimpleUrlHandlerMapping映射的隐式SimpleControllerHandlerAdapter。 因此,明确添加它:
<bean
    class=\"org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter\">
</bean>
而且我们很好,尽管与此同时您可能还需要引入显式替换,以替代隐含的HttpRequestHandlerAdapter:
<bean
    class=\"org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter\">
</bean>