为了实现我们的请求映射版本化解决方案,我实现了自己的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
。
答案 0 :(得分:4)
不太确定,但代码<mvc:annotation-driven />
可能会在您的网络应用中注册RequestMappingHandlerMapping
。
Spring MVC文档提到如果使用MVC命名空间,默认情况下启用RequestMappingHandlerMapping:
Spring 3.1为@RequestMapping引入了一组新的支持类 方法称为RequestMappingHandlerMapping和 RequestMappingHandlerAdapter分别。建议使用它们 使用甚至需要利用Spring MVC中的新功能 3.1并继续前进。默认情况下,从MVC名称空间启用新的支持类,并且必须使用MVC Java配置 如果不同时使用,则显式配置。
因此我怀疑您必须删除<mvc:annotation-driven />
标记才能禁用RequestMappingHandlerMapping
的默认行为。