一个springboot web项目,post请求,controller层映射请求对象,iId
字段为null(springboot默认用的Jackson解析http json请求 )
要映射的object
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class LineRequest {
private Long iId;
private Integer idxId;
请求
{
"iId":1,
"idxId":2
}
结果
LineRequest(iId=null, idxId=2)
问题
iId
赋值失败如果请求改为iid
,反而成功
LineRequest(iId=1, idxId=2)
如果加@JsonProperty
是可以解决的,问题是,默认情况下,为什么不行呢?
(感觉和大小写有关系,和lombok或jackson实现有关)
加setIId方法,断点,看调用栈来反向trace,看初始化流程
setIId
,getIId
正向看set流程
iId
,所以没赋值
com.fasterxml.jackson.databind.deser.impl.MethodProperty#deserializeAndSet
再往前,看为什么beanProperties
没有iId
iId
,但最后又被删除了
_addFields添加了iId
_addMethods,在添加getIId(lombok生成)过程中,动态添加了filed iid
(注意是小写)
iid
,动态添加到了fields中,并把getIId,绑定到了iid上。_removeUnwantedProperties,又把iId
去掉了,因为找不到他的getter/setter,而错误的iid
保留了
错误的iid
是怎么得到的:
com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector#_addGetterMethod
com.fasterxml.jackson.databind.util.BeanUtil#legacyManglePropertyName
iid
,实际LineRequest定义的是iId