首页 文章

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

提问于
浏览
37

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

@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方案,我不想添加重复的代码,但我还没有找到答案 . 任何建议都非常欢迎 .

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

3 回答

  • 4

    您可以为同一功能设置映射网址,并将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的情况下它也会映射,但你可以在方法中控制它 .

    EDIT :之前的解决方案不起作用,因为 @PathVariable 未设置为 null 时没有 {null} 并且无法映射URL(感谢ngeek) . 我认为唯一可能的解决方案是创建两个方法,每个方法用 @MappingRequest 映射,其中一个方法调用另一个函数或重定向到另一个URL(重定向:或转发: spring 前缀) . 我知道这个解决方案不是你能做的最好的事情 . 实际上,您正在创建另一个函数来处理另一个URL .

  • 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"));
    
       }
    
  • 50

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

相关问题