我有一个班级
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
对象时,这两个字段都包含我提供的请求中的值。
我不明白的是:
答案 0 :(得分:5)
1)JSON值如何直接映射到Student类对象:
使用Spring MVC支持配置的Web应用程序(使用@EnableWebMvc
,@Configuration
等配置。)。
默认情况下启用了一些HttpMessageConverters
。
接收新请求时,Spring使用Accept
标头来确定媒体类型。然后它找到可以处理媒体类型的注册转换器。它将使用它来转换实体并发回响应。使用JSON信息接收请求 - Spring使用Content-Type
标头来确定请求正文的媒体类型。
然后它将搜索可以将客户端发送的主体转换为Java对象的HttpMessageConverter
。
例如MappingJackson2HttpMessageConverter
是JSON转换器之一:
参数上使用的公共类MappingJackson2HttpMessageConverter扩展 AbstractJackson2HttpMessageConverter的实现 HttpMessageConverter,可以使用Jackson 2.x读取和写入JSON ObjectMapper。此转换器可用于绑定到类型bean,或 无类型的HashMap实例。
默认情况下,此转换器支持application / json和 带有UTF-8字符集的application / * + json。这可以被覆盖 设置supportedMediaTypes属性。
默认构造函数使用提供的默认配置 Jackson2ObjectMapperBuilder。
与Jackson 2.9及更高版本兼容,从Spring 5.0开始。
@RequestBody
告诉Spring,HTTP请求应该反序列化为Java实体。客户端应用程序指定的Content-Type
标头将有助于确定适当的转换器。
@ResponseBody
向Spring指示返回值是直接序列化到HTTP响应的主体。
2)是否涉及序列化/反序列化?
直接涉及序列化和反序列化。
公共字段,具有提供的getter的字段是可序列化和可反序列化的。 setter只使非公共字段可反序列化。
全局配置也可以在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;
}