JavaBean中出现字段同名但大小写不同,导致转成JsonString时值丢失的问题

371 阅读2分钟

问题背景:公司系统中的代码几乎都遵循驼峰命名法,但是也会有例外的情况,这还不算,更要命的是如果如果有两个相同的字段,但是大小写不同,在进行json序列化时,就会出问题。

今天遇到一个bug,前端某个字段无法展示了。通过抓包查看发现对应的值时返回了的,但是前端没有取到,于是就将问题转移给了前端。前端看过之后说是返回的字段和配置中的字段不一致(返回的字段是驼峰,但是配置中的字段是第二个单词全大写,例如 userName和userNAME),由于配置不能轻易改,只能去修改返回的字段。经过查看之后发现,这个实体类有20多处代码都有引用,如果修改的话,怕会产生新的bug。

image.png

好家伙,这就有点烦了,想了一下决定新增一个字段 userNAME,然后将查询到的 userName 复制到 userNAME上面。这样的话就不会修改别的地方了,尽管代码有些不美观。但是在测试的过程中发现,前端还是不展示。
image.png
通过debug发现,实体类中成功被复制了,但是响应数据硬是没有,那么肯定是实体类对象转成响应数据这一步存在问题。于是灵机一动会不会是get和set的生成出了问题?
想到这,赶紧写代码验证一下:

@Data
public class SameTemplate {
  private String userName;
  private String userNAME;

}

编译之后查看编译后的字节码文件:

public class SameTemplate {
    private String userName;
    private String userNAME;

    public static void main(String[] args) {
        System.out.println("yes");
    }

    public SameTemplate() {
    }

    public String getUserName() {
        return this.userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }
    //此处省略其他代码
}

可以看到只生成了一对get和set方法,对于 userNAME 字段来说,这个字段是没有 get和set方法的,所以在转JSONString的时候就会获取不到。 这个不能说是 JSON转化工具的问题,而是 Lombok 工具的问题,对于同名但是大小写不同的字段,Lombok 的 @Data 注解只会生成一对 get和set方法。

处理方案

最后说一些解决方案吧,由于时间紧急,没有怎么去思考,就手动写了俩对get和set方法,不知道有没有大佬知道更好的解决办法,欢迎在评论区指出,菜鸟勿喷。

image.png