11

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

但是,当尝试访问 annotated 支持的 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)

在调试调度程序时,特别是Dispatcher.getHandlerAdapter()方法,它正在寻找 my 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();
}

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

谢谢。

4

3 回答 3

20

在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>
于 2015-01-24T15:33:30.623 回答
8

事实证明,简单地切换 bean 定义是行不通的,因为 RequestMappingHandlerAdapter 依赖于正在创建和配置的大量实体。默认情况下,Spring 使用 WebMvcConfigurationSupport 实体来完成所有这些默认配置,但简单地创建我自己的 bean 版本并没有帮助,因为 spring 创建了它自己的。

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

@Configuration
public class WebConfig extends WebMvcConfigurationSupport {

  @Bean
  public RequestMappingHandlerAdapter requestMappingHandlerAdapter() {
    RequestMappingHandlerAdapter handlerAdapter = super.requestMappingHandlerAdapter();
    handlerAdapter.getMessageConverters().add(0, getProtobufJsonMessageConverter());
    return handlerAdapter;
  }
于 2013-07-15T18:13:38.507 回答
2
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();
  }
}
于 2017-11-14T11:05:52.250 回答