记一次因lombok升级引起的反序列化失败的bug

记一次因lombok升级引起的反序列化失败的bug

问题出现:

更新项目后,发现原来正常的接口报错,调试发现了报错信息为 json反序列化异常

no suitable constructor found, can not deserialize from Object value (missing default constructor or creator, or perhaps need to add/enable type information?)

字符串转换对象Area 失败,该对象上添加了lombok @Builder @Data 注解,使用的转换方式是 areaProvinceVOS = ObjectMapperFactory.getObjectMapper().readValue(json, valueTypeRef);

问题解决

通过报错信息发现类上缺少构造函数,于是在Area及其包含的子类上添加注解 @AllArgsConstructor @NoArgsConstructor ,序列化正常

原因解析

更新项目过程中,该接口内的代码没有更改过,但是更新了lombok版本,从1.16.22更新到了1.18.8。猜测是1.18 的@Builder 注解没有无参构造函数,导致反序列化失败

由于lombok是编译期起效的,于是查看一下编译后的字节码文件,果然是没有无参构造函数的。有一个全参构造器,但是对于jackson的类型转换是不适用的

记一次因lombok升级引起的反序列化失败的bug