2013-04-04 1 views
2

После перехода с установки XML на установку JavaConfig многие из наших RequestMappings сломались и теперь возвращают неоднозначные ошибки метода. Наши методы полагаются на @ PathVariable с регулярными выражениями для определения того, что нужно вызывать. Например:Spring MVC: Неоднозначные RequestMappings после перехода на JavaConfig

@RequestMapping(value={"/{id:\\d+}/boats"}) 
public String getBoatsById(@PathVariable("id") Long id, Model model, 
HttpServletRequest request) throws Exception {...} 

@RequestMapping(value={"/{id}/boats"}) 
public String getBoatsByName(@PathVariable("id") String id, Model model, 
HttpServletRequest request) throws Exception {...} 

Этого использование для работы с вне вопроса, но с использованием новой установки JavaConfig против установки XML он порывает с неоднозначными ошибками, связанными с отображениями.

Класс JavaConfig начинается так:

@Configuration 
@EnableWebMvc 
@ComponentScan(basePackages = "com.example", excludeFilters = { @ComponentScan.Filter(Configuration.class) }) 
public class WebConfig extends WebMvcConfigurationSupport 

Будет ли это иметь ничего общего с настройкой XML с использованием AnnotationMethodHandlerAdapter по сравнению с классом JavaConfig теперь используют рекомендованную RequestMappingHandlerAdapter? Есть ли у меня настройки?

ответ

0

Только просмотрел исходный код, AnnotationMethodHandlerAdapter использует другой RequestMappingInfo, чем RequestMappingHandlerAdapter. Первый игнорирует шаблон/путь, который вы указали при проверке равенства, в то время как последний чтит его. Вот почему у вас возникают неоднозначные ошибки отображения. Не уверен, что это ошибка или нет, возможно, хорошо спросить людей в списке рассылки spring-contrib.

EDIT

Вероятно, это хорошая идея, чтобы изменить отображение. Синтаксис {name:reg_exp} был введен не для решения двусмысленности. Выдержка из официальной документации:

Иногда вам нужно больше точности при определении переменных шаблона URI. Рассмотрите URL-адрес «/spring-web/spring-web-3.0.5.jar». Как вы можете разбить на несколько частей?

Аннотации @RequestMapping поддерживают использование регулярных выражений в переменных шаблона URI. Синтаксис {имяПерем: регулярное выражение} где первая часть определяет имя переменной, а второй - очередной пример expression.For:

 
@RequestMapping("/spring-web/{symbolicName:[a-z-]+}-{version:\d\.\d\.\d}{extension:\.[a-z]+}") 
public void handle(@PathVariable String version, @PathVariable String extension) { 
    // ...
} }

Ваши методы обработчика были неоднозначны с самого начала, вы только обеспечил хакерский способ решить эту двусмысленность.

Смежные вопросы