Spring Web MVC:对请求参数和路径变量使用相同的请求映射

2022-09-01 04:32:43

有没有办法表达我的Spring Web MVC控制器方法应该通过请求传入ID作为URI路径的一部分来匹配...

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

...或者如果客户端以样式将ID作为HTTP请求参数发送...

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

在我看来,这是一个非常常见的现实世界URL方案,我不想添加重复的代码,但我还没有找到答案。任何建议都非常受欢迎。

编辑:事实证明,目前似乎(使用Spring MVC < = 3.0)没有办法实现这一目标,请参阅Javi答案中的讨论。


答案 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)
{
}

虽然当id不发送时它也会映射,但您可以在方法内部控制它。

编辑:以前的解决方案不起作用,因为没有,并且无法映射URL(感谢ngeek)。我认为唯一可能的解决方案是创建两个方法,每个方法都与其映射,其中一个调用另一个函数或重定向到另一个URL(重定向:或转发:Spring前缀)。我知道这个解决方案不是你想要的,但我认为这是你能做的最好的。实际上,您没有复制代码,而是创建了另一个函数来处理另一个URL。@PathVariablenull{null}@MappingRequest


答案 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"));

   }

推荐