使用Lombok@Value注解类时Jackson无法反序列化简单JSON如何解决
问题原因
@Value是Lombok用于生成不可变类的注解,会将类中所有字段设为final,仅生成私有全参构造方法,不会生成公共无参构造方法。@Builder注解默认不会生成Jackson可识别的反序列化创建器,Jackson反序列化时默认需要公共无参构造方法实例化对象,或明确标注的创建器来通过全参构造/构造器模式创建对象,两者同时使用时Jackson找不到符合要求的实例创建入口,就会抛出对应异常。
解决方案
提供三种可选方案,可根据业务场景选择:
- 最简适配方案:在类上添加Lombok的
@Jacksonized注解,该注解专门适配@Builder+@Value的使用场景,会自动生成Jackson反序列化所需的构造器适配逻辑,无需修改其他代码:
@Value @Builder @Jacksonized public class RecipeListRemoveDTO { int recipeListId; }
- 手动标注构造器方案:给类添加
@JsonCreator注解标注的全参构造方法,同时给每个参数添加@JsonProperty指定对应JSON字段名,适合字段数量较少的场景:
@Value @Builder public class RecipeListRemoveDTO { int recipeListId; @JsonCreator public RecipeListRemoveDTO(@JsonProperty("recipeListId") int recipeListId) { this.recipeListId = recipeListId; } }
- 替换为可变类方案:如果业务不需要不可变类特性,可将
@Value替换为@Data注解,@Data会自动生成公共无参构造和Getter/Setter,Jackson可直接完成反序列化:
@Data @Builder public class RecipeListRemoveDTO { int recipeListId; }
内容的提问来源于stack exchange,提问作者uniqueuser-programmer
相关产品推荐
相关产品推荐

