SpringMVC 3.0到3.1 ControllerClassNameHandlerMapping的迁移

SpringMVC 3.0到3.1 ControllerClassNameHandlerMapping的迁移,spring,spring-mvc,url-mapping,Spring,Spring Mvc,Url Mapping,我在Sping3.0中已有一个应用程序,它使用ControllerClassNameHandlerMapping映射控制器和方法,例如: StartController.class is mapped to http://127.0.0.1/app/start/* 然后 以下是我的配置: @Bean public ControllerClassNameHandlerMapping classNameControllerMappings() { return new Controlle

我在Sping3.0中已有一个应用程序,它使用ControllerClassNameHandlerMapping映射控制器和方法,例如:

StartController.class is mapped to http://127.0.0.1/app/start/*
然后

以下是我的配置:

@Bean
public ControllerClassNameHandlerMapping classNameControllerMappings() {
     return new ControllerClassNameHandlerMapping() {{
        setCaseSensitive(true);
        setDefaultHandler(new UrlFilenameViewController());
        setInterceptors(new Object[]
                {callProgressionInterceptorHandler(),
                 callSessionInterceptorHandler(),
                 localeChangeInterceptor()});
     }};
}
我的大多数控制器在每个控制器中都有5-15个请求映射方法

但是当我升级到Spring3.1+时,每个控制器的请求映射变得不明确,并且没有正确映射

我已经读到一个解决方案是明确地添加方法名称:

@RequestMapping(method = RequestMethod.GET)
现在将是:

@RequestMapping(method = RequestMethod.GET, value = "init")
如果不需要的话,我真的不想手动将@RequestMapping值添加到100多个方法中

有人能提供更好的解决方案吗

以下是我不断遇到的错误:

        47672 [btpool0-1] ERROR org.springframework.web.context.ContextLoader - Context initialization failed
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping#0': Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'addressConfirmationController' bean method
    public void com.comcast.ivr.d2.web.controllers.AddressConfirmationController.houseNumber_rc(org.springframework.ui.ModelMap)
    to {[],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}: There is already 'addressConfirmationController' bean method
我还添加了setOrder(1);到ControllerClassNameHandlerMapping,仍然会得到此错误

更新: 我在以下摘录中看到:

在Spring3.1之前,类型和方法级别的请求映射分为两个独立的阶段进行检查——首先由DefaultAnnotationHandlerMapping选择控制器,然后由AnnotationMethodHandlerAdapter缩小要调用的实际方法的范围

在Spring3.1中有了新的支持类,RequestMappingHandlerMapping是唯一一个决定哪个方法应该处理请求的地方。将控制器方法视为唯一端点的集合,其中每个方法都有从类型和方法级别@RequestMapping信息派生的映射


这是否意味着如果不在@RequestMapping中添加映射细节,我就无法保持相同的@RequestMapping,因为我这样做了。这种不明确的映射错误是否合理?它们有意义吗?是的,它们有意义,但是将请求映射值字符串添加到100+方法将需要大量的回归测试,这太昂贵了,因此我们无法升级到Spring 3.1+。您的应用程序中还有其他HandlerMappings吗?如果是这样,其中一个是否在ControllerClassNameHandlerMapping之前运行?如果给ControllerClassNameHandlerMapping一个1的顺序会怎么样?因此,看起来应该覆盖DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter以通过ControllerClassNameHandlerMapping获取映射。您可以提供一个具有多个处理程序的示例控制器吗。想看看你是如何定义它们的。
        47672 [btpool0-1] ERROR org.springframework.web.context.ContextLoader - Context initialization failed
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping#0': Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'addressConfirmationController' bean method
    public void com.comcast.ivr.d2.web.controllers.AddressConfirmationController.houseNumber_rc(org.springframework.ui.ModelMap)
    to {[],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}: There is already 'addressConfirmationController' bean method