问题描述
|
如标题所示,我正在尝试并无法在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>