原文: https://javatutorial.net/requestbody-annotation-in-spring

@RequestBody注解可用于处理 Web 请求。

Spring 中的`RequestBody`注解 - 图1

更具体地说,它用于将方法参数与请求的主体绑定,其工作方式是HttpMessageConverter根据请求内容的类型转换请求的主体。

语法

  1. <modifier> <return-type> <method-name> (@RequestBody <type> <name>) {
  2. }

以上语法的示例:

  1. public String congratulateEmployee(@RequestBody Employee emp) {
  2. }

包含上述方法的完整Controller类:

  1. @RestController
  2. public class CongratulationsController {
  3. @PostMapping("/congratulations")
  4. public Manager assignToManager(@RequestBody Employee emp) {
  5. String name = emp.getName();
  6. int yearsWorked = emp.getYearsWorked();
  7. String message = "Congratulations, " + name + "! You have been working here for " + yearsWorked + ".";
  8. Manager manager = new Manager();
  9. manager.setEmployee(emp.getName()); // now this employee has been assigned to this manager
  10. return manager;
  11. }
  12. }

我们的Employee类如下所示:

  1. public class Employee {
  2. private String name;
  3. private int yearsWorked;
  4. public String getName() {
  5. return name;
  6. }
  7. public int getYearsWorked() {
  8. return yearsWorked;
  9. }
  10. }

我们的Manager类如下所示:

  1. public class Manager {
  2. private String employee;
  3. public void setEmployee(String name) {
  4. employee = name;
  5. }
  6. public String getEmployee() {
  7. return employee;
  8. }
  9. }

分解

就像我上面说的,我们收到的 JSON 格式反序列化为 Java 类型。

当我们说@RequestBody Employee emp时,我们将Employee类型的方法参数与 Web 请求的主体绑定在一起。RequestBody到达如下:

  1. {
  2. "name": "John Doe",
  3. "yearsWorked": "3"
  4. }

再次感谢HttpMessageConverter方法,我们可以将该RequestBody JSON 响应转换为Employee对象,该对象包含公共方法getName()getYearsWorked()。 这就是为什么我们可以在RequestBody参数上调用这些方法的原因:

  1. String name = emp.getName();
  2. int yearsWorked = emp.getYearsWorked();

作为该方法的结果,我们返回了类型为Manager的数据,由于HttpMessageConverter,我们已将返回类型转换为以下响应格式:

  1. {
  2. "employee": "the name of the employee that was contained in the @RequestBody"
  3. }

附带一提,RequestBody注释与RestController注释一样,主要用于 REST API。