2010-02-24 4 views
8

Я работаю над проектом Spring MVC с помощью аннотированного контроллера. Одна вещь, которая меня интересует, касается порядка, который инструкция для обработки. Например, я хочу, чтобы все /green/basic/welcome отображались на GreenController.welcome() , но green/{treeId}/{treeName} отображались на GreenController.viewTree(treeId, treeName).Упорядоченный запросСсылка весной MVC

Я думаю, мне нужно указать два @RequestMapping с @RequestMapping из /green/basic/welcome быть обработан первым, так что это не будет интерпретатор как вызов GreenControllerviewTree("basic", "welcome").

Можете ли вы, ребята, направить меня на это?

+0

Вы уверены, что не можете изменить URL-адрес для/green/basic/welcome для того, что бы не столкнулось с/green/{treeId}/{treeName}? –

+0

Я знаю, это должно быть так. Мне просто интересно, как '@ RequestMapping' обрабатываются по порядку. –

+0

Мне тоже интересно это, и я еще не нашел четкого ответа. Кто-нибудь знает об этом? – InverseFalcon

ответ

7

Точное совпадение для RequestMapping будет иметь преимущество перед одним с PathVariable. Таким образом, у вас было бы два сопоставления запросов, как вы указали. Один для обработки конкретного URL-адреса, а переменная версия поймает все остальное. Spring проверяет прямой путь соответствует перед проверкой пути переменных матчей, поэтому порядок не имеет значения, если у вас есть два отображения запроса с тем же числом переменного путем, которые могут выплюнуть Согласовать IllegalStateException

Регулярно проверяйте source of org.springframework.web.servlet.handler.AbstractHandlerMethodMapping для конкретики. Он обрабатывается в lookupHandlerMethod().

Чтобы определить оптимальное совпадение двух RequestMapping s, которые не являются точными совпадениями, применяется метод compareTo() RequestMappingInfo.

+1

Удобная деталь реализации знать. Существует ли какая-либо публичная документация (кроме источника), которая определяет это поведение для api? – digitaljoel