1.问题
今天对接接口的时候遇到个小坑,pId传到前端变成了pid(字段还是直接用pid比较好),查了半天,发现是由于 Jackson 序列化库在推断字段名时应用的简化规则导致的;
2.原因
当使用 Lombok 生成 getter 和 setter 时,对于 pId 这样的字段,Lombok 会生成 getPId() 和 setPId() 方法。然而,Jackson 默认会将属性名的第一个字符转换为小写,如果它是一个大写字母,并且第二个字符是大写字母,那么会认为它是一个缩写,于是就直接把两个字母都变成小写了。
-
Lombok会根据字段名自动生成getter和setter方法,例如,对于字段pId,Lombok会生成getPId()和setPId();
-
而SpringMVC生成的是getpId()和setpId()
3.解决办法
我感觉最好不要用第二个字母需要大写的字段;
如果硬要使用pId这种字段,就在字段添加注解或者重写get、set,让他转成 json 的时候变成指定名字
@JsonProperty("pId")
private String pId;
public String getpId() {return pId;
}
public void setpId(String pId) {
this.pId = pId;
}