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仍然被初始化。由于重复的请求映射,该失败。

我怎样才能避免这种情况?在我看来,我的网络应用程序在没有默认RequestMappingHandlerMapping.

4

1 回答 1

4

不太确定,但标签<mvc:annotation-driven />可能正在RequestMappingHandlerMapping您的 webapp 中注册。

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

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

来源:文档

所以我怀疑你必须去掉那个<mvc:annotation-driven />标签才能禁用RequestMappingHandlerMapping.

于 2012-12-20T15:17:52.907 回答