@RequestBody注解的原理

@RequestBody 是 Spring MVC 中的一个注解,用于将 HTTP 请求体中的数据绑定到方法的参数上。当一个 HTTP 请求发送到你的应用时,请求体可能包含了 JSON、XML 或其他格式的数据。@RequestBody 能够将这些数据转换成 Java 对象,通常是实体类或 DTO(Data Transfer Object)。

以下是 @RequestBody 如何将请求体中的数据映射到实体类中的过程:

识别请求体数据:
当一个带有 @RequestBody 注解的方法被调用时,Spring 会检查 HTTP 请求的 Body 部分。
内容类型检测:
Spring 会检查请求头中的 Content-Type,以确定请求体中的数据格式。例如,如果 Content-Type 是 application/json,那么 Spring 会使用 JSON 处理器来解析数据。
数据解析:
Spring 使用相应的消息转换器(Message Converter)来解析请求体中的数据。对于 JSON 数据,Spring 默认使用 MappingJackson2HttpMessageConverter 或 Jackson2ObjectMapperBuilder 来进行解析,这取决于你的配置。
对象映射:
解析后的数据会被映射到带有 @RequestBody 注解的方法参数上。Spring 会尝试将解析得到的 JSON 对象的属性与方法参数中实体类的属性进行匹配。如果实体类的属性名称与 JSON 中的键匹配,那么对应的值就会被赋给实体类的属性。
类型转换:
如果 JSON 中的键与实体类属性名称不完全匹配,但可以通过驼峰命名法(camelCase)或下划线命名法(snake_case)转换来匹配,Spring 也能正确地进行映射。此外,Spring 还支持基本数据类型及其包装类之间的自动类型转换。
验证和填充对象:
一旦所有的属性都被正确映射,实体类对象就被完全填充。Spring 还支持对实体类进行验证,如果启用了方法级别的数据验证(例如使用了 @Valid 或 @Validated 注解)。
方法调用:
完全填充和验证过的实体类对象作为参数传递给带有 @RequestBody 注解的方法,从而完成数据绑定的过程。

理解性问题:
只要实体类的属性名称与 JSON 中的键匹配,那么对应的值就会被赋给实体类的属性吗,如果json的value的数据类型与实体类的属性的数据类型不相同,只是名称可以匹配那么还可以映射啊?

答案是可以的,Spring 与 JSON 库(如 Jackson 或 Gson)会尝试进行类型转换。这种类型转换能力是自动的,但有一定的限制。以下是可能发生的情况:

自动类型转换:
如果 JSON 值可以被解析并转换为目标类型,那么转换会自动发生。例如,如果 JSON 字符串中的值是 “123”,而实体类的属性类型是 int 或 Integer,那么 “123” 会被自动转换为整数值 123。
基本类型转换:
Spring 支持基本类型(如 int, long, double)及其包装类(如 Integer, Long, Double)之间的转换。此外,字符串可以被转换为基本类型和包装类型,只要字符串可以被解析为相应的数值。
枚举类型:
JSON 中的字符串值可以被转换为枚举类型,只要该字符串与枚举中的某个常量名称匹配。
日期类型:
JSON 中的日期字符串可以被转换为 Date, LocalDate, LocalDateTime 等日期时间类型,只要字符串格式与日期时间解析器所预期的格式匹配。
复杂类型:
对于复杂类型(如自定义的实体类或集合类型),JSON 库会递归地进行映射和转换。如果 JSON 结构与实体类结构相匹配,那么转换会成功。
类型转换失败:
如果 JSON 值无法被转换为目标类型,例如,如果 JSON 中的值是 “NaN” 并且实体类属性是 int 类型,那么在尝试转换时会抛出异常。异常类型可能因 JSON 库的不同而异,但常见的有 JsonMappingException 和 JsonProcessingException。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JH3073

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值