2013-07-03 51 views
11

我最近升级到了spring 3.2,并注意到AnnotationMethodHandlerAdapter已被弃用,转而使用RequestMappingHandlerAdapter。所以我重新配置使用新类,完成我需要的自定义MessageConverter。一切都很好,很好。用RequestMappingHandlerAdapter替换AnnotationMethodHandlerAdapter问题

但是,试图击中一个注解Controller支持的URL的时候,我发现了一个错误:

[java] javax.servlet.ServletException: No adapter for handler [[email protected]]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler 
[java]  at org.springframework.web.servlet.DispatcherServlet.getHandlerAdapter(DispatcherServlet.java:1128) 
[java]  at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:903) 
[java]  at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) 

调试时的调度,特别是,在Dispatcher.getHandlerAdapter()方法,它的发现我的HandlerAdapter,但要调用的AbstractHandlerMethodAdapter.supports()想要一个MethodHandler

public final boolean supports(Object handler) { 
    return handler instanceof HandlerMethod && supportsInternal((HandlerMethod) handler); 
} 

和控制器不是HandlerMethod。该AnnotatedMethodHandlerAdapter的支持方法..好,不同的(作品仍然!)

public boolean supports(Object handler) { 
    return getMethodResolver(handler).hasHandlerMethods(); 
} 

所以我显然不能简单地升级到新的类......我失去了一些额外的配置,但文档ISN真的帮不了我。有任何想法吗?

谢谢。

回答

18

Spring配置文件,而不是写自己的实现WebMvcConfigurationSupport

例如

<mvc:annotation-driven/> 
<context:component-scan base-package="com.springapp.mvc"/> 
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix" value="/WEB-INF/pages/"/> 
     <property name="suffix" value=".jsp"/> 
    </bean> 

    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> 
     <property name="messageConverters"> 
      <list> 
       <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/> 
       <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/> 
       <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"/> 
       <bean class="org.springframework.http.converter.FormHttpMessageConverter"/> 
       <bean class="org.springframework.http.converter.StringHttpMessageConverter"/> 
      </list> 
     </property> 

    </bean> 
7

所以,事实证明,简单的切换bean定义不起作用,因为RequestMappingHandlerAdapter取决于正在创建和配置的整个主机。 Spring默认使用WebMvcConfigurationSupport实体来完成所有这些默认配置,但仅仅创建我自己的bean版本并没有帮助,因为spring会自己创建它。

我的方法最终成为了下面的一些东西,我基本上把所有的配置都留给了Spring的默认配置,但是后来添加了我自己的转换器。唯一的缺点是它将xml配置切换到javaconfig,但在我的情况下,没关系。有一篇文章here描述了类似的东西。

@Configuration 
public class WebConfig extends WebMvcConfigurationSupport { 

    @Bean 
    public RequestMappingHandlerAdapter requestMappingHandlerAdapter() { 
    RequestMappingHandlerAdapter handlerAdapter = super.requestMappingHandlerAdapter(); 
    handlerAdapter.getMessageConverters().add(0, getProtobufJsonMessageConverter()); 
    return handlerAdapter; 
    } 
+4

对于它的价值这是记录HTTP在使用 “<mvc:annotation-driven/>”://文档.spring.io /弹簧的框架/文档/ 3.1.X /弹簧的框架参考/ HTML /新功能于3.1.html#新功能于3.1处理程序法控制器处理 –

1
import org.springframework.context.annotation.Configuration; 
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; 
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; 
@Configuration 
public class WebConfig extends WebMvcConfigurationSupport { 
    @Override 
    protected RequestMappingHandlerAdapter createRequestMappingHandlerAdapter() { 
    return new XXXXRequestMappingHandlerAdapter(); 
    } 
}