用RequestMappingHandlerAdapter问题替换AnnotationMethodHandlerAdapter

tic*_*ock 11 spring-mvc

我最近升级到3.2版本,并注意到AnnotationMethodHandlerAdapter已经弃用了赞成RequestMappingHandlerAdapter.所以我重新配置使用新类,完成MessageConverter我需要的自定义.一切都很好.

但是,当试图点击带注释的URL支持时Controller,我收到一个错误:

 [java] javax.servlet.ServletException: No adapter for handler [my.company.TagController@1c2e7808]: 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)
Run Code Online (Sandbox Code Playgroud)

在调试调度程序时,特别是Dispatcher.getHandlerAdapter()方法,它找到了我的HandlerAdapter,但是AbstractHandlerMethodAdapter.supports()调用它需要一个MethodHandler:

public final boolean supports(Object handler) {
  return handler instanceof HandlerMethod && supportsInternal((HandlerMethod) handler);
}
Run Code Online (Sandbox Code Playgroud)

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

public boolean supports(Object handler) {
  return getMethodResolver(handler).hasHandlerMethods();
}
Run Code Online (Sandbox Code Playgroud)

所以我显然不能简单地升级到新类...我缺少一些额外的配置,但文档并没有真正帮助我.有任何想法吗?

谢谢.

小智 20

<mvc:annotation-driven/>在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>
Run Code Online (Sandbox Code Playgroud)


tic*_*ock 8

事实证明,由于RequestMappingHandlerAdapter依赖于正在创建和配置的整个实体主机,因此简单地切换bean定义不起作用.默认情况下,Spring使用WebMvcConfigurationSupport实体来执行所有这些默认配置,但只是创建自己的bean版本没有用,因为spring创建了自己的bean版本.

我的方法最终成为下面的内容,我基本上将所有配置保留到spring的默认值,但随后添加了我自己的转换器.唯一的缺点是它将xml配置切换到javaconfig,但在我的情况下,它没关系.有一篇文章在这里描述类似的东西.

@Configuration
public class WebConfig extends WebMvcConfigurationSupport {

  @Bean
  public RequestMappingHandlerAdapter requestMappingHandlerAdapter() {
    RequestMappingHandlerAdapter handlerAdapter = super.requestMappingHandlerAdapter();
    handlerAdapter.getMessageConverters().add(0, getProtobufJsonMessageConverter());
    return handlerAdapter;
  }
Run Code Online (Sandbox Code Playgroud)

  • 值得记录的是http://docs.spring.io/spring-framework/docs/3.1.x/spring-framework-reference/html/new-in-3.1.html#new-in-3.1-handler -method控制器处理 (4认同)