SpringMVC 3.0 для 3.1 миграции ControllerClassNameHandlerMapping
У меня есть существующее приложение в Sping 3.0, которое использует ControllerClassNameHandlerMapping для сопоставления контроллера и такие методы, как:
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+, сопоставление запросов становится неоднозначным для каждого контроллера и отображается неправильно.
Я прочитал, что одно решение состоит в том, чтобы явно добавить имя mthod:
@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?
У меня есть сотни методов, которые необходимо изменить, чтобы это произошло...:-(