问题背景:公司系统中的代码几乎都遵循驼峰命名法,但是也会有例外的情况,这还不算,更要命的是如果如果有两个相同的字段,但是大小写不同,在进行json序列化时,就会出问题。
今天遇到一个bug,前端某个字段无法展示了。通过抓包查看发现对应的值时返回了的,但是前端没有取到,于是就将问题转移给了前端。前端看过之后说是返回的字段和配置中的字段不一致(返回的字段是驼峰,但是配置中的字段是第二个单词全大写,例如 userName和userNAME),由于配置不能轻易改,只能去修改返回的字段。经过查看之后发现,这个实体类有20多处代码都有引用,如果修改的话,怕会产生新的bug。
好家伙,这就有点烦了,想了一下决定新增一个字段 userNAME,然后将查询到的 userName 复制到 userNAME上面。这样的话就不会修改别的地方了,尽管代码有些不美观。但是在测试的过程中发现,前端还是不展示。
通过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方法,不知道有没有大佬知道更好的解决办法,欢迎在评论区指出,菜鸟勿喷。