@RequestBody 和@ResponseBody 注解用于将HTTP 请求和响应的Body 转换为Java 类对象。在使用 Java 对象转换/映射 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 对象。
例如:-
标头通知服务器应用程序有关 HTTP 响应主体的可接受的媒体类型**。根据 Accept 标头的值,服务器应用程序从可用的消息转换器中选择正确的消息转换器,用于将 Java 类(对象)转换为请求的响应类型。
例如:-
在简单的形式中,我们可以说@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 注释用于在选定的 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 下载或克隆源代码
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://www.dailycodebuffer.com/springs-requestbody-and-responsebody-annotations/
内容来源于网络,如有侵权,请联系作者删除!