【问题标题】:replacing AnnotationMethodHandlerAdapter with RequestMappingHandlerAdapter issue用 RequestMappingHandlerAdapter 问题替换 AnnotationMethodHandlerAdapter
【发布时间】:2013-06-30 12:51:03
【问题描述】:

我最近升级到 spring 3.2 并注意到 AnnotationMethodHandlerAdapter 已被弃用,取而代之的是 RequestMappingHandlerAdapter。所以我重新配置以使用新类,并配有我需要的自定义MessageConverter。一切都很好。

但是,当我尝试访问带注释的 Controller 支持的 URL 时,出现错误:

 [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)

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

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

并且控制器不是HandlerMethodAnnotatedMethodHandlerAdapter 的支持方法是......好吧,不同(并且仍然有效!)

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

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

谢谢。

【问题讨论】:

    标签: spring-mvc


    【解决方案1】:

    在spring配置文件中使用“<mvc:annotation-driven/>”代替自己编写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>
    

    【讨论】:

      【解决方案2】:

      事实证明,简单地切换 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;
        }
      

      【讨论】:

      【解决方案3】:
      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();
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2014-06-12
        • 2013-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多