问题背景
今天遇到一个特别恶心的事情,我的返回实体类遵循了字段属性明明规则,驼峰命名法,在接口返回数据给前端的时候,所有数字那个字母全部自动变为了小写字母!
错误的返回示例:
正确的返回示例:
分析问题
接口中我使用了缓存,以及在返回数据时候用了响应实体包装了, 没有直接返回数据库映射实体类。
怀疑问题点:
-
响应实体包装实体类中的字段有误,全部写成了小写字母?
-
缓存在出入库的时候会自动转化大小写。
问题排查
按照这个思路,检查了我的响应实体类以及我的数据库映射实体类,完全是正确的数据结构,没有任何问题。而且在我们转化过程中也是全部为大写的。
接着,我将缓存去掉了,检验一下是否跟缓存信息有关系?
去掉缓存之后依然是不正确的格式,仍是全部小写。
所以,没办法, 还得是去看响应实体中是否有问题,这时候我发现了我的实体类生成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方法。所以就会出现上面我们所说的大小写问题!
解决方案
- 我们自己手动编写get/set方法
- 使用别名,用注解@JsonProperty("yCoorinate")
- 在使用lombok的时候,不使用一个小写字母接一个大写字母的属性命名
今天的问题就讲解到这,欢迎大家留言交流!也欢迎大家关注我的工种昊《coder练习生》