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
属性而不是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) {