一个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#_addGetterMethodcom.fasterxml.jackson.databind.util.BeanUtil#legacyManglePropertyNameiid,实际LineRequest定义的是iId

