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

时间:2012-12-20 14:12:54

标签: spring-mvc

为了实现我们的请求映射版本化解决方案,我实现了自己的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的IMHO重要部分:

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

如果您希望我在那里寻找其他线路,请告诉我。

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

我该如何避免这种情况?我看到它的方式,我的网络应用程序将运行良好,没有默认的RequestMappingHandlerMapping

1 个答案:

答案 0 :(得分:4)

不太确定,但代码<mvc:annotation-driven />可能会在您的网络应用中注册RequestMappingHandlerMapping

Spring MVC文档提到如果使用MVC命名空间,默认情况下启用RequestMappingHandlerMapping:

  

Spring 3.1为@RequestMapping引入了一组新的支持类   方法称为RequestMappingHandlerMapping和   RequestMappingHandlerAdapter分别。建议使用它们   使用甚至需要利用Spring MVC中的新功能   3.1并继续前进。默认情况下,从MVC名称空间启用新的支持类,并且必须使用MVC Java配置   如果不同时使用,则显式配置。

来源:documentation

因此我怀疑您必须删除<mvc:annotation-driven />标记才能禁用RequestMappingHandlerMapping的默认行为。