Spring Web MVC: используйте одно и то же отображение запроса для параметра запроса и переменной пути - PullRequest
37 голосов
/ 30 апреля 2010

Есть ли способ выразить, что мой метод контроллера Spring Web MVC должен совпадать с запросом, передающим идентификатор как часть пути 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) </em> нет способа достичь этого, см. Обсуждение в ответ Джави.

Ответы [ 3 ]

50 голосов
/ 30 апреля 2010

Вы можете установить как 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)
{
}

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

РЕДАКТИРОВАТЬ : предыдущее решение не работает, потому что @PathVariable не установлено в null, когда нет {null}, и не может сопоставить URL (спасибо ngeek). Тогда я думаю, что единственно возможное решение - создать два метода, каждый из которых сопоставлен со своим @MappingRequest, и внутри одного из них вызовет другую функцию или перенаправит на другой URL-адрес (redirect: или forward: Spring prefixes). Я знаю, что это решение не то, что вы ищете, но думаю, что это лучшее, что вы можете сделать. На самом деле вы не дублируете код, но создаете другую функцию для обработки другого URL.

4 голосов
/ 24 мая 2015

Если вы все еще хотите придерживаться подхода 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"));

   }
2 голосов
/ 09 декабря 2015

Аннотация @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) {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...