Difference between path and value attributes in @RequestMapping annotation

后端 未结 3 1540
旧巷少年郎
旧巷少年郎 2021-01-07 16:54

What is the difference between below two attributes and which one to use when?

@GetMapping(path = \"/usr/{userId}\")         


        
相关标签:
3条回答
  • 2021-01-07 17:09

    @GetMapping is an alias for @RequestMapping

    @GetMapping is a composed annotation that acts as a shortcut for @RequestMapping(method = RequestMethod.GET).

    value method is an alias for path method.

    This is an alias for path(). For example @RequestMapping("/foo") is equivalent to @RequestMapping(path="/foo").

    So both methods are similar in that sense.

    0 讨论(0)
  • 2021-01-07 17:24

    As mentioned in the comments (and the documentation), value is an alias to path. Spring often declares the value element as an alias to a commonly used element. In the case of @RequestMapping (and @GetMapping, ...) this is the path property:

    This is an alias for path(). For example @RequestMapping("/foo") is equivalent to @RequestMapping(path="/foo").

    The reasoning behind this is that the value element is the default when it comes to annotations, so it allows you to write code in a more concise way.

    Other examples of this are:

    • @RequestParam (valuename)
    • @PathVariable (valuename)
    • ...

    However, aliases aren't limited to annotation elements only, because as you demonstrated in your example, @GetMapping is an alias for @RequestMapping(method = RequestMethod.GET).

    Just looking for references of AliasFor in their code allows you to see that they do this quite often.

    0 讨论(0)
  • 2021-01-07 17:27

    @GetMapping is a shorthand for @RequestMapping(method = RequestMethod.GET).

    In your case. @GetMapping(path = "/usr/{userId}") is a shorthand for @RequestMapping(value = "/usr/{userId}", method = RequestMethod.GET).

    Both are equivalent. Prefer using shorthand @GetMapping over the more verbose alternative. One thing that you can do with @RequestMapping which you can't with @GetMapping is to provide multiple request methods.

    @RequestMapping(value = "/path", method = {RequestMethod.GET, RequestMethod.POST, RequestMethod.PUT)
    public void handleRequet() {
    
    }
    

    Use @RequestMapping when you need to provide multiple Http verbs.

    Another usage of @RequestMapping is when you need to provide a top level path for a controller. For e.g.

    @RestController
    @RequestMapping("/users")
    public class UserController {
    
        @PostMapping
        public void createUser(Request request) {
            // POST /users
            // create a user
        }
    
        @GetMapping
        public Users getUsers(Request request) {
            // GET /users
            // get users
        }
    
        @GetMapping("/{id}")
        public Users getUserById(@PathVariable long id) {
            // GET /users/1
            // get user by id
        }
    }
    
    0 讨论(0)
提交回复
热议问题