SpringMVC 3.0到3.1迁移ControllerClassNameHandlerMapping

时间:2013-04-16 16:40:57

标签: spring spring-mvc url-mapping

我在Sping 3.0中有一个现有的应用程序,它使用ControllerClassNameHandlerMapping来映射Controller和方法,例如:

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

然后

StartController.class has a method called init() that is mapped to http://127.0.0.1/app/start/init.html

这是我的配置:

@Bean
public ControllerClassNameHandlerMapping classNameControllerMappings() {
     return new ControllerClassNameHandlerMapping() {{
        setCaseSensitive(true);
        setDefaultHandler(new UrlFilenameViewController());
        setInterceptors(new Object[]
                {callProgressionInterceptorHandler(),
                 callSessionInterceptorHandler(),
                 localeChangeInterceptor()});
     }};
}

我的大多数控制器在每个控制器中都有5-15个请求映射方法。

但是当我升级到Spring 3.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并仍然出现此错误。

更新: 我在http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/mvc.html上看到以下摘录:

在Spring 3.1之前,类型和方法级请求映射在两个单独的阶段中进行了检查 - 首先通过DefaultAnnotationHandlerMapping选择控制器,然后通过AnnotationMethodHandlerAdapter缩小实际的调用方法。

使用Spring 3.1中的新支持类,RequestMappingHandlerMapping是唯一决定应该处理请求的方法的地方。将控制器方法视为一组唯一端点,并为从类型和方法级别@RequestMapping信息派生的每个方法提供映射。

这是否意味着我不能保持相同的@RequestMapping而不在@RequestMapping中添加映射细节,因为我做了< 3.1?

我有数百种方法需要修改才能实现......: - (

0 个答案:

没有答案