代码之家  ›  专栏  ›  技术社区  ›  ngeek

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

  •  37
  • ngeek  · 技术社区  · 15 年前

    有没有一种方法可以表示我的SpringWebMVC控制器方法应该通过一个请求来匹配,这个请求将一个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) {
    

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

    编辑: 事实证明,目前 (弹簧MVC<=3.0) 没有办法做到这一点,请参阅javi答案中的讨论。

    3 回复  |  直到 10 年前
        1
  •  50
  •   sharptooth    12 年前

    您可以为同一个函数设置映射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未发送时也会映射,但是您可以在方法内部控制它。

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

        2
  •  4
  •   vivex    10 年前

    如果您仍然希望使用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"));
    
       }
    
        3
  •  2
  •   Jpnh    10 年前

    这个 @RequestMapping 注释现在支持设置 path 属性而不是 name value . 用 路径 ,您可以实现此问题所需的映射:

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