Json序列化对象后,使用Lombok后属性xAxis大写变成小写xaxis解决方法
一、问题描述
最近在开发后端接口时,发现返回结构中,一个字段大小写转化有问题。
lombok版本:1.18.14
VO对象如下,字段为echarts趋势图组件。预期返回xAxis,实际返回xaxis
@Data
public class ULineBarVO {
/**
* X轴信息
*/
private ULineBarDataVO xAxis;
/**
* Y轴信息
*/
private Map<String,Object> yAxis;
}
Spring boot项目中使用Lombok注解@Data之后,返回给前端的是xaxis,而不是我们预期中的xAxis。
二、问题原因
针对首字母小写,第二个字母大写的这种驼峰命名时。
使用@Data注解生成的getter和setter方法分别是:
public Map<String, Object> getYAxis() {
return yAxis;
}
public void setYAxis(Map<String, Object> yAxis) {
this.yAxis = yAxis;
}
而正常场景下及Spring中对象的getter和setter方法应该是,注意方法名上getyAxis首字母是小写:
public Map<String, Object> getyAxis() {
return yAxis;
}
public void setyAxis(Map<String, Object> yAxis) {
this.yAxis = yAxis;
}
也就是说Lombok与Spring针对这种首字母小写,第二个字母大写的对象的解析是不同的,而这也就自然而然影响到默认的Jackson的解析,导致返回给前端的属性名称不是我们预期中的名称。
三、Lombok问题
其实,针对这个问题,多年前就有人已经在lombok的github提出过对应的issue,参考:
无论是Lombok还是Spring,在处理对象的时候总会有一个API规范进行参考的,这个规范一般就是JavaBeans API的规范。而针对这个问题,Lombok的官方回复是:
JavaBeans的规范就是这样的,Lombok只是遵循这个规范而已,并且不应该使用首字母小写,第二个字母大写这样的命名规则,而Spring的处理方式才是没有遵循JavaBean的规范。除非Oracle官方推荐如此或者大家都是这样处理的化,Lombok才会进行修改。
也就是说,Lombok认为,JavaBeans的规范就是这么定义的,而针对JavaBean的规范,Spring和Lombok选择了不同的实现方式:
Spring,Jackson针对get/set的生成方式,和我们使用 IDEA 编译器自动生成get/set的方式是相同的,都是诸如
getiPhone()
的形式。Lombok,针对get/set的生成方式,是
getIPhone()
的形式。
其实根据JavaBeans的描述,是没有具体说明针对我们文中这个问题,首字母小写,第二个字母大写这样的字段该如何get/set的
四、解决方法,因为预期返回xAxis,而不是返回xaxis。需要手写get set方法,不使用lombok。解析正常
public Map<String, Object> getyAxis() {
return yAxis;
}
public void setyAxis(Map<String, Object> yAxis) {
this.yAxis = yAxis;
}
本人开发了一款在线的程序员工具箱,包含json、mysql格式化,ChatGPT等程序员常用的功能。欢迎您访问
地址:https://www.robots2.com/
参考文章:https://www.jianshu.com/p/bef7b73e5062