使用Jackson结合Lombok Builder进行JSON反序列化时遭遇字段未识别问题
解决Jackson与Lombok @Builder配合的反序列化错误
我帮你排查出问题所在了,咱们来一步步解决这个Jackson反序列化和Lombok Builder配合的bug:
问题根源
你把@JsonPOJOBuilder注解错误地标注在了Item主类上,而这个注解的正确位置是Lombok生成的ItemBuilder类上。Jackson需要这个注解来识别Builder类中没有前缀的setter方法(比如partitionvalue(String)),否则它无法将JSON字段映射到Builder的属性上,就会抛出“Unrecognized field”错误。
解决方案1:显式定义Builder类并添加@JsonPOJOBuilder
因为Lombok生成的Builder类默认是隐式的,我们可以显式定义一个空的Builder类壳,让Lombok自动增强它,同时给这个类加上@JsonPOJOBuilder(withPrefix="")注解:
@Builder @JsonDeserialize(builder = Item.ItemBuilder.class) public class Item { @Getter String partitionvalue; // 显式定义Builder类,Lombok会自动填充内部实现 @JsonPOJOBuilder(withPrefix = "") public static class ItemBuilder {} }
这样Jackson就能正确识别Builder类中的无前缀方法,将JSON的partitionvalue字段映射到Builder的对应属性上,顺利完成反序列化。
解决方案2:结合@JsonProperty注解(可选增强)
如果上面的方法还不生效,可以给Item类的字段加上@JsonProperty注解,明确指定JSON字段名,确保Jackson能精准映射:
@Builder @JsonDeserialize(builder = Item.ItemBuilder.class) public class Item { @Getter @JsonProperty("partitionvalue") String partitionvalue; @JsonPOJOBuilder(withPrefix = "") public static class ItemBuilder {} }
补充说明
你提到的@Jacksonized注解之所以能解决问题,是因为它自动帮你完成了这些配置(包括把@JsonPOJOBuilder正确加到Builder类上),但由于它属于lombok-experimental组件,手动调整注解位置就可以达到同样的效果,不需要依赖experimental功能。
内容的提问来源于stack exchange,提问作者Ron U
相关产品推荐
相关产品推荐

