1.问题起因:
在编写接口的时候需要传递一个任务id字段,由于该接口是提供给外部系统(W系统)使用的,因此在字段前添加w作为标识,字段名为wAssayTaskId
2.问题定位
a.首先怀疑是自己代码写的问题(比如类型,字段名) 备注:检查之后发现没问题
b.怀疑是@Data的问题
在删除@Data注解后,使用idea生成get/set方法,发现 该set方法未setwAssayTaskId()
而@Data生成的set方法未setWAssayTaskId(),,删除掉@Data注解,然后使用显式声明的set/get方法,该问题解决
3.原因分析
在第2步问题是解决了,但是要尽力找一下原因,为什么会生成setwAssayTaskId()该方法呢
众所周知,从前端传递到后端的参数,是需要序列化之后赋值到request的body体中的
debug流程太长,因此在这里贴几张比较重要的图
_addMethods方法会针对每一个成员变量生成一个POJOPropertyBuilder对象
debug到这里的时候发现生成的set方法为setWAssayTaskId
继续向下执行,走到okNameForMutator发现setWAssayTaskId获取成员变量的时候转换成了wassayTaskId,但是正确的应该是wAssayTaskId
那么可以确定是legacyManglePropertyName方法有问题,
在初始化刚进来的时候 c = W,d= w;但是在下面for循环的时候会继续获取下一个字母A 转为小写的a拼到sb中进行返回.因此导致上一步的问题
至此.原因已经基本定位清楚,总结下是因为springmvc在序列化的时候获取到wassayTaskId给wAssayTaskId进行赋值,因此导致该字段一直为null;
目前整理的解决方案如下
1.进行避免wAssayTaskId这类的命名,可以修改为 assaytaskIdForW
2.在wAssayTaskId上添加@JsonProperty("wAssayTaskId")注解
3.显式的声明set/get方法