在接口的入参中使用@Data注解,字段无法赋值

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方法

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值