Spring Web MVC: Use same request mapping for request parameter and path variable

前端 未结 3 1000
南旧
南旧 2020-12-12 19:46

Is there a way to express that my Spring Web MVC controller method should be matched either by a request handing in a ID as part of the URI path ...

@Request         


        
相关标签:
3条回答
  • 2020-12-12 19:49

    You can set both mapping url for the same function and setting id as optional.

    @RequestMapping(method=RequestMethod.GET, value={"/campaigns","/campaigns/{id}"})
    public String getCampaignDetails(Model model,
         @RequestParam(value="id", required=false) Long id,
         @PathVariable("id") Long id2)
    {
    }
    

    though it would map as well when id is not sent, but you can control this inside the method.

    EDIT: The previous solution doesn't work because @PathVariable is not set to null when there isn't {null} and it cannot map the URL (thanks ngeek). I think then that the only possible solution is to create two methods each one mapped with its @MappingRequest and inside one of them call the other function or redirect to the other URL (redirect: or forward: Spring prefixes). I know this solution is not what you're looking for but think it's the best you can do. Indeed you're not duplicating code but you're creating another function to handle another URL.

    0 讨论(0)
  • 2020-12-12 19:49

    The @RequestMapping annotation now supports setting the path attribute instead of name or value. With path, you can achieve the mapping desired by this question:

    @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) {
    
    0 讨论(0)
  • 2020-12-12 20:13

    If you still want to stick to PathVariable approach and if you are getting 400 syntactically incorrect error then follow this approach-

     @RequestMapping(method=RequestMethod.GET, value={"campaigns/{id}","campaigns"})
                             public String getCampaignDetails(Model model,
                             @PathVariable Map<String, String> pathVariables) 
       {
    
         System.out.println(pathVariables.get("id"));
    
       }
    
    0 讨论(0)
提交回复
热议问题