批注中路径属性和值属性@RequestMapping差异

以下两个属性之间有什么区别,何时使用哪一个?

@GetMapping(path = "/usr/{userId}")
public String findDBUserGetMapping(@PathVariable("userId") String userId) {
  return "Test User";
}

@RequestMapping(value = "/usr/{userId}", method = RequestMethod.GET)
public String findDBUserReqMapping(@PathVariable("userId") String userId) {
  return "Test User";
}

答案 1

如注释(和文档)中所述,是 的别名。Spring通常将该元素声明为常用元素的别名。在 (and , ...) 的情况下,这是属性:valuepathvalue@RequestMapping@GetMappingpath

这是 path() 的别名。例如,等效于 。@RequestMapping("/foo")@RequestMapping(path="/foo")

这背后的原因是,当涉及到注释时,该元素是默认的,因此它允许您以更简洁的方式编写代码。value

这方面的其他例子是:

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

但是,别名不仅限于注释元素,因为如示例中所示,别名是 的别名。@GetMapping@RequestMapping(method = RequestMethod.GET

只需在他们的代码中查找AliasFor的引用,您就可以看到他们经常这样做。


答案 2

@GetMapping是 的简写。@RequestMapping(method = RequestMethod.GET)

在你的情况下。 是 的简写。@GetMapping(path = "/usr/{userId}")@RequestMapping(value = "/usr/{userId}", method = RequestMethod.GET)

两者是等效的。更喜欢使用速记而不是更详细的替代方法。您可以做的一件事是无法做到的,那就是提供多种请求方法。@GetMapping@RequestMapping@GetMapping

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

}

在需要提供多个 Http 谓词时使用。@RequestMapping

的另一种用法是当您需要为控制器提供顶级路径时。例如:@RequestMapping

@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
    }
}