繁体   English   中英

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

[英]How JSON body is converted to POJO in Spring MVC

我上课了

class Student {
    String id;
    String name;
    //getters
    //setters
}

我有一个JSON请求

{
  "id": "1",
  "name": "asd",
}

我有一个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;
}

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

我不明白的是:

  1. JSON值如何直接映射到Student类对象?
  2. 是否涉及序列化/反序列化?
  3. 建构者在学生班中有什么重要性吗?

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

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

默认情况下启用了一些HttpMessageConverters

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

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

例如, MappingJackson2HttpMessageConverter是JSON转换器之一:

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

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

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

与Spring 2.9兼容,与Jackson 2.9及更高版本兼容。

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

@ResponseBody上的@ResponseBody向Spring指示返回值是直接序列化到HTTP响应的主体。

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

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

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

3)学生班级中的构造函数是否重要?

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

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

@JsonCreator
public Student (@JsonProperty("id") String id, @JsonProperty("name") String name) {
    this.id = id;
    this.name = name;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM