Spring 的 RequestBody 和 ResponseBody 注解

x33g5p2x  于2022-09-25 转载在 Spring  
字(2.9k)|赞(0)|评价(0)|浏览(328)

@RequestBody 和@ResponseBody 注解用于将HTTP 请求和响应的Body 转换为Java 类对象。在使用 Java 对象转换/映射 HTTP 请求/响应正文的过程中,这两个注释都将使用已注册的 HTTP 消息转换器

什么是HTTP消息转换器?

Browser 或 Rest 客户端无法在 HTTP 请求的正文中发送 Java 对象(原样)。并且服务器无法使用 Java 对象(按原样)组成 HTTP 响应正文。因此 HTTP 请求和响应正文都不能包含 Java 对象。

这些 HTTP 请求和响应对象应包含 JSON、XML 或其他数据格式的数据。因此,HTTP 消息转换器用于将 HTTP 请求正文(JSON 或 XML)转换为 Java 对象,并将 Java 对象转换回 XML 或 JSON 以组成 HTTP 响应。

消息转换器如何工作?

你一定对java如何转换消息感到困惑? Hoe spring 框架识别内容类型以转换 Java 对象。这是通过检查 HTTP 请求的标头来实现的。让我们详细看看这些标题是什么。

内容类型

标头通知服务器应用程序有关 HTTP 请求正文的内容类型。根据 HTTP 请求的 Header 信息中指定的内容类型,服务器应用程序从可用的消息转换器中挑选出正确的消息转换器,用于将 HTTP 请求正文转换为 Java 对象。

例如:-

  • 如果 Content-Typeapplication/json, 那么它将选择 JSON 到 Java 对象转换器。
  • 如果 Content-Typeapplication/xml, 那么它将选择一个 XML 到 Java 对象的转换器。

接受

标头通知服务器应用程序有关 HTTP 响应主体的可接受的媒体类型**。根据 Accept 标头的值,服务器应用程序从可用的消息转换器中选择正确的消息转换器,用于将 Java 类(对象)转换为请求的响应类型。

例如:-

  • 如果 Acceptapplication/json, 那么它将选择一个 Java 对象到 JSON 转换器。
  • 如果 Acceptapplication/xml, 那么它将选择一个 Java 对象到 XML 转换器。

@RequestBody

在简单的形式中,我们可以说@RequestBody 注解用于将 HttpRequest 主体映射到 Java 对象,从而能够将入站 HTTPRequest 主体自动反序列化为 Java 对象。

首先,让我们检查一下 EmployeeController 方法,

@RestController
@RequestMapping("/api")
public class EmployeeController {

    @Autowired
    private EmployeeRepository employeeRepository;

    @PostMapping(value = "/employee")
    public Employee createEmployee(@RequestBody Employee employee)
    {
        return  employeeRepository.save(employee);
    }
}

假设指定了适当的类型,Spring 会自动将 JSON 反序列化为 Java 类型。默认情况下,我们用@RequestBody 注解的Type(Object)在从客户端(Browser 或Rest Client)发出时必须对应JSON 格式。

@Entity
@Table(name = "employees")
public class Employee {

    @Id
    @GeneratedValue
    private Long id;
    private String name;
    private String country;
    private String email;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

现在,让我们看看 JSON 数据是如何从客户端传递到 Controller 方法的,该方法将 HTTP 消息类型转换为适当的 Java 类型。

如果我们不传递指定为 Java 类型的数据,那么它将不会映射到 Java 类型的特定属性。考虑在此示例中,在 Java 类型中定义了一个 name 属性。而不是 name,如果我们传递 ename,这是一个不同的属性名称,它不会映射到 Java 对象,它的值将是 null

@ResponseBody

ResponseBody 注释用于在选定的 HTTP 消息转换器的帮助下向 HTTP 响应添加返回值。如前所述,消息转换器是基于 HTTP 标头的 Accept Header 信息的值。 @RestController 是实现此功能的首选方式,该功能之前由 @ResponseBody 提供。在 Spring 框架中@Controller@ResponseBody 的行为与@RestController 相同。**因此,它避免了在方法前加上 @响应体

package com.dailycodebuffer.examples.springboothttpconverter.Controller;

import com.dailycodebuffer.examples.springboothttpconverter.Entity.Employee;
import com.dailycodebuffer.examples.springboothttpconverter.Repository.EmployeeRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@Controller
@RequestMapping("/api")
public class EmployeeController {

    @Autowired
    private EmployeeRepository employeeRepository;

    @ResponseBody
    @GetMapping(value = "/employee/{id}")
    public Employee getEmployeeById(@PathVariable Long id)
    {
        return  employeeRepository.findById(id).get();
    }
}

您可以从 Github 下载或克隆源代码

相关文章

微信公众号

最新文章

更多