在Spring MVC中如何将JSON主体转换为POJO

use*_*280 3 java rest serialization deserialization

我有一堂课

class Student {
    String id;
    String name;
    //getters
    //setters
}
Run Code Online (Sandbox Code Playgroud)

我有一个JSON请求

{
  "id": "1",
  "name": "asd",
}
Run Code Online (Sandbox Code Playgroud)

我有一个REST API

@RequestMapping(value = "/student", method = RequestMethod.POST, produces = "application/json")
    public @ResponseBody String getstudent(HttpServletRequest request, HttpServletResponse response,
            @RequestBody Student student,
            @RequestHeader HttpHeaders requestHeaders) {

     return null;
}
Run Code Online (Sandbox Code Playgroud)

当我调用此API并可视化此student对象时,两个字段都具有我提供的请求中的值。

我不明白的是:

  1. JSON值如何直接映射到Student类对象?
  2. 是否涉及序列化/反序列化?
  3. 在学生课堂上,构造函数有什么重要性吗?

J-A*_*lex 5

1)JSON值如何直接映射到Student类对象:

您正在使用的Web应用程序配置有Spring MVC支持(配置有@EnableWebMvc,@Configuration等等)。

HttpMessageConverters默认情况下有一些启用。

收到新请求后,Spring使用Accept标头确定媒体类型。然后,它找到可以处理媒体类型的注册转换器。它将使用它来转换实体并发送回响应。接收带有JSON信息的请求-Spring使用Content-Type标头来确定请求正文的媒体类型。

然后它将搜索一个HttpMessageConverter可以将客户端发送的主体转换为Java对象的对象。

例如MappingJackson2HttpMessageConverter,JSON转换器之一:

公共类MappingJackson2HttpMessageConverter扩展了HttpMessageConverter的AbstractJackson2HttpMessageConverter实现,可以使用Jackson 2.x的ObjectMapper读取和写入JSON。该转换器可用于绑定到类型化的bean或未类型化的HashMap实例。

默认情况下,此转换器支持带有UTF-8字符集的application / json和application / * + json。可以通过设置supportedMediaTypes属性来覆盖它。

默认构造函数使用Jackson2ObjectMapperBuilder提供的默认配置。

从Spring 5.0开始与Jackson 2.9和更高版本兼容。

@RequestBody用于参数的参数告诉Spring应该将HTTP请求反序列化为Java实体。Content-Type客户端应用程序指定的标头将有助于确定适当的转换器。

@ResponseBody 方法上的向Spring表示返回值直接序列化到HTTP响应的正文。

2)是否涉及序列化/反序列化?

直接涉及序列化和反序列化。

公共字段,具有提供的吸气剂的字段可序列化和反序列化。设置器使非公共字段只能反序列化。全局配置也可以在ObjectMapper级别上完成,以使用公共字段或getter / setter方法进行序列化。

3)构造函数在学生课堂上有什么重要性吗?

默认情况下不涉及构造函数。正如我在上一节中提到的,getter和setter用于访问字段。

但是,可以使用@JsonCreator并@JsonProperty参与序列化/反序列化过程来配置构造函数:

@JsonCreator
public Student (@JsonProperty("id") String id, @JsonProperty("name") String name) {
    this.id = id;
    this.name = name;
}
Run Code Online (Sandbox Code Playgroud)