接口返回数据实体类属性大写变成小写

问题背景

今天遇到一个特别恶心的事情,我的返回实体类遵循了字段属性明明规则,驼峰命名法,在接口返回数据给前端的时候,所有数字那个字母全部自动变为了小写字母!

错误的返回示例:

 

正确的返回示例:

 

分析问题

接口中我使用了缓存,以及在返回数据时候用了响应实体包装了, 没有直接返回数据库映射实体类。

怀疑问题点:

  • 响应实体包装实体类中的字段有误,全部写成了小写字母?

  • 缓存在出入库的时候会自动转化大小写。

问题排查

按照这个思路,检查了我的响应实体类以及我的数据库映射实体类,完全是正确的数据结构,没有任何问题。而且在我们转化过程中也是全部为大写的。

接着,我将缓存去掉了,检验一下是否跟缓存信息有关系?

去掉缓存之后依然是不正确的格式,仍是全部小写。

所以,没办法, 还得是去看响应实体中是否有问题,这时候我发现了我的实体类生成get/set方法用的是lombok框架的@Data注解生成!

定位到问题

上面我们说了用的是lombok框架生成我们的get/set方法

查看我们的编译结果生成的class类:

lombok生成的get/set方法:


public String getXCoordinate() {
    return this.xCoordinate;
}

public String getYCoordinate() {
    return this.yCoordinate;
}

我们手写生成的get/set方法

 

 

public String getxCoordinate() {
    return this.xCoordinate;
}

public void setxCoordinate(String xCoordinate) {
    this.xCoordinate = xCoordinate;
}

public String getyCoordinate() {
    return this.yCoordinate;
}

public void setyCoordinate(String yCoordinate) {
    this.yCoordinate = yCoordinate;
}

这样很明显看出了两者的区别,这样就可以看出问题出在了哪里!因为我们SpringMvc默认使用jackson解析json,而jackson又依赖于实体类的get/set方法。所以就会出现上面我们所说的大小写问题!

解决方案

  1. 我们自己手动编写get/set方法
  2. 使用别名,用注解@JsonProperty("yCoorinate")
  3. 在使用lombok的时候,不使用一个小写字母接一个大写字母的属性命名

今天的问题就讲解到这,欢迎大家留言交流!也欢迎大家关注我的工种昊《coder练习生》

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
在 Spring Boot 应用中,可以使用 Jackson 库来进行 JSON 序列化和反序列化。默认情况下,Jackson 库会根据 Java 对象属性的命名规范来生成 JSON 字段名,而在 JavaScript 中,对象属性一般使用小写字母命名。 为了解决这个问题,可以使用 Jackson 库中的命名策略来改变生成的 JSON 字段名。常用的命名策略有 SnakeCase 命名策略和 KebabCase 命名策略,它们分别将属性名中的大写字母转换为下划线或短横线,并将所有单词转换为小写。这样,在序列化时生成的 JSON 字段名就会符合约定的命名规范。 具体实现方式如下: 1. 在 Spring Boot 应用的配置文件中添加以下配置,将 Jackson 库的命名策略设置为 `LOWER_CASE_WITH_UNDERSCORES`: ```yaml spring: jackson: property-naming-strategy: LOWER_CASE_WITH_UNDERSCORES ``` 2. 在需要进行序列化和反序列化的类上添加 `@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)` 注解,该注解将使用 SnakeCase 命名策略(即将属性名中的大写字母转换为小写,并添加下划线)。 ```java import com.fasterxml.jackson.databind.PropertyNamingStrategy; import com.fasterxml.jackson.databind.annotation.JsonNaming; @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class) public class MyClass { private String myField; // getter and setter } ``` 这样,在进行序列化时生成的 JSON 字段名就会符合 JavaScript 的小写命名规范。在前端接收到后端返回的 JSON 数据时,也不需要对字段名进行任何转换,可以直接使用小写字母的属性名。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ybb_ymm

你的鼓励会是对我最大的支持

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

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

打赏作者

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

抵扣说明:

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

余额充值