Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring mvc 将AnnotationMethodHandlerAdapter替换为RequestMappingHandlerAdapter问题_Spring Mvc - Fatal编程技术网

Spring mvc 将AnnotationMethodHandlerAdapter替换为RequestMappingHandlerAdapter问题

Spring mvc 将AnnotationMethodHandlerAdapter替换为RequestMappingHandlerAdapter问题,spring-mvc,Spring Mvc,我最近升级到Spring3.2,并注意到AnnotationMethodHandlerAdapter已被弃用,取而代之的是RequestMappingHandlerAdapter。因此,我重新配置以使用新类,并使用我需要的自定义MessageConverter。一切都很好 但是,当尝试点击带注释的控制器支持的URL时,我收到一个错误: [java] javax.servlet.ServletException: No adapter for handler [my.company.TagCon

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

但是,当尝试点击带注释的
控制器支持的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时,尤其是调试
dispatcher.getHandlerAdapter()
方法时,它会查找我的
HandlerAdapter
,但是调用的
AbstractHandlerMethodAdapter.supports()
需要一个
MethodHandler

public final boolean supports(Object handler) {
  return handler instanceof HandlerMethod && supportsInternal((HandlerMethod) handler);
}
并且控制器不是
HandlerMethod
AnnotatedMethodHandlerAdapter
的支持方法是。。嗯,不同(而且仍然有效!)

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


谢谢。

事实证明,简单地切换bean定义是行不通的,因为RequestMappingHandlerAdapter依赖于创建和配置的整个实体主机。默认情况下,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;
  }
在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>

为了证明这是值得的
    <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>
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();
  }
}