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

nge*_*eek 37 java spring annotations spring-mvc

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

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

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

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

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

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

Jav*_*avi 50

您可以为同一功能设置映射网址,并将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)
{
}
Run Code Online (Sandbox Code Playgroud)

虽然在没有发送id的情况下它也会映射,但你可以在方法中控制它.

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