Подтвердить что ты не робот

Spring Web MVC: используйте одно и то же сопоставление запросов для параметра запроса и переменной пути

Есть ли способ выразить, что мой метод управления веб-MVC Spring должен быть согласован либо с помощью запроса, передающего идентификатор, как часть пути URI...

@RequestMapping(method=RequestMethod.GET, value="campaigns/{id}")
public String getCampaignDetails(Model model, @PathVariable("id") Long id) {

... или если клиент отправляет идентификатор в качестве параметра запроса HTTP в стиле...

@RequestMapping(method=RequestMethod.GET, value="campaigns")
public String getCampaignDetails(Model model, @RequestParam("id") Long id) {

Мне кажется, что это довольно распространенная схема URL-адресов в реальном мире, где я не хочу добавлять повторяющийся код, но пока я не смог найти ответ. Любые советы приветствуются.

РЕДАКТИРОВАТЬ: Оказывается, что в настоящее время (с Spring MVC <= 3.0) нет способа достичь этого, см. обсуждение внутри ответа Javi.

4b9b3361

Ответ 1

Вы можете установить оба URL-адреса отображения для одной и той же функции, а параметр id - как необязательный.

@RequestMapping(method=RequestMethod.GET, value={"/campaigns","/campaigns/{id}"})
public String getCampaignDetails(Model model,
     @RequestParam(value="id", required=false) Long id,
     @PathVariable("id") Long id2)
{
}

хотя он также отображался бы, когда идентификатор не отправляется, но вы можете контролировать это внутри метода.

EDIT. Предыдущее решение не работает, потому что @PathVariable не установлен на null, когда нет {null}, и он не может отобразить URL-адрес (спасибо ngeek). Я думаю, что единственным возможным решением является создание двух методов, каждый из которых сопоставляется с его @MappingRequest и внутри одного из них вызывает другую функцию или перенаправляет другой URL-адрес (перенаправление: или вперед: Spring префиксы). Я знаю, что это решение не то, что вы ищете, но считайте это лучшим, что вы можете сделать. Действительно, вы не дублируете код, но вы создаете еще одну функцию для обработки другого URL-адреса.

Ответ 2

Если вы все еще хотите придерживаться подхода PathVariable и если вы получаете 400 синтаксически неправильных ошибок, то следуйте этому подходу -

 @RequestMapping(method=RequestMethod.GET, value={"campaigns/{id}","campaigns"})
                         public String getCampaignDetails(Model model,
                         @PathVariable Map<String, String> pathVariables) 
   {

     System.out.println(pathVariables.get("id"));

   }

Ответ 3

Аннотация @RequestMapping теперь поддерживает установку атрибута path вместо name или value. С помощью path вы можете достичь желаемого соответствия по этому вопросу:

@RequestMapping(method=RequestMethod.GET, path="campaigns/{id}")
public String getCampaignDetails(Model model, @PathVariable("id") Long id) {

@RequestMapping(method=RequestMethod.GET, value="campaigns")
public String getCampaignDetails(Model model, @RequestParam("id") Long id) {