Difference between path and value attributes in @RequestMapping annotation
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
(value
→name
)@PathVariable
(value
→name
)- ...
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.
@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 }}
@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.