@RequestBody 注解无法解析对象中首字母小写,第二个字母大写的属性(Jackson 的原因)

@RequestBody 注解无法解析对象中首字母小写,第二个字母大写的属性(Jackson 的原因)

2024-4-16 22:00

例如属性为 eName

当 get/set 方法名称为 getEName/setEName 的时候,会因为 Jackson 在处理完 getEName/setEName 后无法找到对应的属性

Lombok 也是,由于 Lombok 生成的 get/set 方法的语义规范与 Jackson 处理 get/set 方法不一致,所以会导致的属性名无法匹配。

以下流程参考: https://zhuanlan.zhihu.com/p/628668559 (写得很详细)

Jackson 的处理流程:

  • 首先会根据 offset字段去除前面的三个字母,一般为 get 或 set
  • 去除前面三个字母 set 后,发现第一个字母 E 是大写的,因此将第一个字母小写成 e,然后接着往后找,如果后面的还是大写,接着变小写…直到找到了一个本来就是小写的字母后,才将后面所有的字母一股脑添加进来。

由于 setEName 在去除前面的 set 后,前面两个字母都是大写,因此在这种处理逻辑下,最后得到的属性名为 ename

换句话说,如果 set 方法的名称是 seteName ,那么处理后得到的就是正确的 eName

所以解决方案:

  1. 使用 Lombok 的配置来解决。在项目根目录下创建 lombok.config文件,并添加配置项lombok.accessors.capitalization = beanspec即可
  2. 改 get/set 的方法名
  3. 利用 Jackson 的 JsonProperty 注解强行指定属性名(推荐在get方法上标注)

但由于 Lombok 和 ptg 插件都只能生成属性名首字母大写的 get/set 方法,如果实在懒得自己写,可以用 @JsonProperty 来标注该属性在 JSON 中的名称

但是:使用 @JsonProperty 注解标注属性,序列化时会多出一个字段(参考 ”使用 @JsonProperty 注解标注属性导致序列化时多出一个字段的原因“ 的内容)

先说结论,只需要满足以下两个条件之一即可解决序列化和反序列化的问题

  • 在 get 方法上标注 @JsonGetter(“name”) 或者 @JsonProperty(“name”) ————推荐在 get 方法上标注 @JsonProperty
  • 在 set 方法上标注 @JsonSetter(“name”) 或者 @JsonProperty(“name”)
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要实现对所有带有 `@RequestBody` 注解的 POST 请求的请求对象参数的某个参数进行统一校验,你可以使用 Spring 框架提供的校验功能。以下是一个示例代码: 首先,需要在你的请求对象参数类添加校验注解。假设你的请求对象参数类为 `MyRequest`,其有一个字段 `param` 需要进行校验,你可以在该字段上添加注解,例如 `@NotBlank` 表示不能为空: ```java public class MyRequest { @NotBlank(message = "param不能为空") private String param; // getter and setter } ``` 接下来,在你的控制器方法,使用 `@Valid` 注解标记该请求对象参数,并在方法参数添加一个 `BindingResult` 参数用于接收校验结果: ```java @PostMapping("/api/my-endpoint") public ResponseEntity<?> myEndpoint(@Valid @RequestBody MyRequest request, BindingResult bindingResult) { if (bindingResult.hasErrors()) { // 处理校验错误 return ResponseEntity.badRequest().body(bindingResult.getFieldErrors()); } // 继续处理正常逻辑 return ResponseEntity.ok("Success"); } ``` 在上述代码,`@Valid` 注解会触发对 `MyRequest` 对象的校验,校验结果会被存储在 `BindingResult` 对象。如果有校验错误发生,你可以根据需求进行相应的错误处理。 这样,无论是哪个 POST 请求使用了 `@RequestBody` 注解并传递了 `MyRequest` 对象,都会进行统一的校验。你可以根据具体的需求,使用不同的校验注解来对各个参数进行校验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值