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

时间:2010-04-30 15:04:56

标签: java spring spring-mvc annotations

有没有办法表明我的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) {

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

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

3 个答案:

答案 0 :(得分: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)
{
}

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

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

答案 1 :(得分:4)

如果你仍然想坚持使用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 :(得分:2)

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