【问题标题】:How to enable Spring 3.0 MappingJacksonHttpMessageConverter with @ResponseBody AND pre-Spring-3.0 Controller SimpleUrlHandlerMapping together?如何使用 @ResponseBody 和 pre-Spring-3.0 控制器 SimpleUrlHandlerMapping 一起启用 Spring 3.0 MappingJacksonHttpMessageConverter?
【发布时间】:2011-09-02 15:21:48
【问题描述】:

正如标题所示,我正在尝试让以下组合在 Spring 3.0 中工作但未能成功:

  • 使用 SimpleUrlHandlerMapping 映射的 Pre-Spring-3.0 控制器,以及,
  • 一个 Spring-3.0 @Controller 使用 MappingJacksonHttpMessageConverter 和 @ResponseBody 返回 JSON。

所有部件都可以工作 - 除非放在一起!

更详细地说,我有一个现有的 Spring web 应用程序,其中包括许多 pre-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>

现在,我正在向使用 @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 ....]

我从有同样问题的&lt;mvc:annotation-driven/&gt; 开始。我尝试重新排序但没有成功,包括订单属性。而且我也没有在 Spring 文档中找到解释。 Spring自动魔法中似乎有一些我没有深入了解的交互。

有趣的问题有人吗?非常感谢您的见解!

【问题讨论】:

    标签: spring-mvc jackson


    【解决方案1】:

    发帖你会发现的(由于缺乏声誉延迟了 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>
    

    【讨论】:

      猜你喜欢
      • 2010-12-15
      • 2014-02-28
      • 2012-08-04
      • 2012-05-30
      • 1970-01-01
      • 2011-10-01
      • 1970-01-01
      • 2015-08-12
      • 1970-01-01
      相关资源
      最近更新 更多