如何避免初始化Spring的默认RequestMappingHandlerMapping?

3
为了实现我们的请求映射版本控制解决方案,我实现了自己的RequestMappingHandlerMapping作为它的子类。我重写了registerHandlerMethod()lookupHandlerMethod()方法。关键概念是一个请求映射可能会出现多次,但不同的实现存储在不同的Java包中。我的新类从servlet路径的第一个路径元素中选择所需的版本号,并从正确的包中获取相应的实现。在查找正确的请求映射处理程序之前,版本号将被删除。
这是我如何将它编入Spring中的方式:
import javax.inject.Inject;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;

@Configuration
public class VersioningWebMvcConfigurationSupport extends WebMvcConfigurationSupport {

  private VersioningRequestMappingHandlerMapping requestMappingHandlerMapping;

  @Override
  @Bean
  public RequestMappingHandlerMapping requestMappingHandlerMapping() {
    requestMappingHandlerMapping.setOrder(0);
    requestMappingHandlerMapping.setInterceptors(getInterceptors());
    return requestMappingHandlerMapping;
  }

  @Inject
  public void setRequestMappingHandlerMapping(VersioningRequestMappingHandlerMapping requestMappingHandlerMapping) {
    this.requestMappingHandlerMapping = requestMappingHandlerMapping;
  }

}

我的applicationContext.xml中最重要的部分如下:

  <context:annotation-config />
  <context:mbean-export />
  <context:component-scan base-package="..." />
  <mvc:annotation-driven />

如果您想让我查找其他行,请告诉我。

我的问题是,我的代码运行正确,重复项被正确处理。然而,原始的 (?) RequestMappingHandlerMapping 仍然被初始化。由于重复的请求映射,它会失败。

我该如何避免这种情况?在我看来,我的 Web 应用程序可以在没有默认的 RequestMappingHandlerMapping 的情况下很好地运行。


你使用的Spring MVC版本是什么?我怀疑是3.1。 - Viral Patel
@ViralPatel Spring 3.1.1。很抱歉我忘记了这个信息。 - sjngm
1个回答

4
不是很确定,但标签<mvc:annotation-driven />可能会在您的Web应用程序中注册 RequestMappingHandlerMapping 。 Spring MVC文档提到,如果您使用MVC命名空间,则默认情况下启用RequestMappingHandlerMapping:Spring 3.1引入了一组新的支持类来支持@RequestMapping方法,分别称为RequestMappingHandlerMapping和RequestMappingHandlerAdapter。他们被推荐使用,甚至需要利用Spring MVC 3.1及以后版本的新功能。新的支持类通过MVC命名空间和MVC Java配置默认启用,但如果不使用任何一个,则必须显式配置。来源:documentation。因此,我怀疑您必须摆脱那个<mvc:annotation-driven />标记,以禁用RequestMappingHandlerMapping的默认行为。

是的,我遇到了这个问题。现在我正在尝试找到使用普通bean配置进行所有这些组件注册时<mvc:annotation-driven />所做的完全相同的配置。很遗憾我找不到它。你有这方面的链接吗? - sjngm
很不幸的是,我也找不到。我会在有任何进展时立即回复您。 - Viral Patel
好的,我确实找到了一个,但是它无法工作,出现了ClassNotFoundException: javax.validation.ValidatorFactory - sjngm
1
这里有一个带注释的示例(https://gist.github.com/870021)。没有“DefaultAnnotationHandlerMapping”,它可以正常加载。现在我只需要让内容协商工作起来... - sjngm
啊哈!!那可不容易找到。我必须在http://viralpatel.net上写一篇好的教程来总结它。 - Viral Patel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接