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,参考:

https://github.com/projectlombok/lombok/issues/757

无论是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 

posted @ 2023-05-12 17:00  黑水滴  阅读(358)  评论(1编辑  收藏  举报