最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

Json序列化对象后,使用Lombok后属性xAxis大写变成小写xaxis解决方法-天天时讯

来源:博客园

一、问题描述

最近在开发后端接口时,发现返回结构中,一个字段大小写转化有问题。

lombok版本:1.18.14


(资料图)

VO对象如下,字段为echarts趋势图组件。预期返回xAxis,实际返回xaxis

@Datapublic class ULineBarVO {     /**     * X轴信息     */    private ULineBarDataVO xAxis;    /**     * Y轴信息     */    private Map yAxis;}

Spring boot项目中使用Lombok注解@Data之后,返回给前端的是xaxis,而不是我们预期中的xAxis。

二、问题原因

针对首字母小写,第二个字母大写的这种驼峰命名时。

使用@Data注解生成的getter和setter方法分别是:

public Map getYAxis() {    return yAxis;}public void setYAxis(Map yAxis) {    this.yAxis = yAxis;}

而正常场景下及Spring中对象的getter和setter方法应该是,注意方法名上getyAxis首字母是小写:

public Map getyAxis() {    return yAxis;}public void setyAxis(Map 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的

https://stackoverflow.com/questions/2948083/naming-convention-for-getters-setters-in-java/49348966#49348966https://github.com/projectlombok/lombok/issues/504

四、解决方法,因为预期返回xAxis,而不是返回xaxis。需要手写get set方法,不使用lombok。解析正常

public Map getyAxis() {    return yAxis;}public void setyAxis(Map yAxis) {    this.yAxis = yAxis;}

本人开发了一款在线的程序员工具箱,包含json、mysql格式化,ChatGPT等程序员常用的功能。欢迎您访问

地址:https://www.robots2.com/

参考文章:https://www.jianshu.com/p/bef7b73e5062

关键词: