Spring Web MVC:请求参数和pathvariables使用相同的请求映射

有没有一种方式来expression,我的Spring Web MVC控制器方法应该通过请求交付一个ID作为URIpath的一部分匹配…

@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) { 

这在我看来是一个相当常见的真实世界的URLscheme,我不想添加重复的代码,但我还没有find答案。 任何build议非常欢迎。

编辑:事实certificate,目前似乎(与Spring MVC的= 3.0)无法实现这一点,见Javi的答案内的讨论。

您可以为同一个函数设置两个映射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不发送,但你可以控制这个方法内。

编辑 :以前的解决scheme无法正常工作,因为@PathVariable没有设置为null时,不存在{null} ,它不能映射的URL(谢谢ngeek)。 我认为唯一可能的解决scheme是创build两个方法,每个方法都使用@MappingRequest映射,其中一个调用另一个函数或redirect到另一个URL(redirect:或forward:Spring前缀)。 我知道这个解决scheme不是你正在寻找的东西,而是认为这是你能做的最好的。 事实上,你不重复代码,但你正在创build另一个函数来处理另一个URL。

如果你仍然想坚持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")); } 

@RequestMapping注解现在支持设置path属性而不是namevalue 。 有了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) {