DTO类消除getter/setter样板代码 使用Lombok注解报错解决
Lombok改造JSON列DTO的运行时转换异常解决
异常根因
报错的核心是Lombok生成的Java Bean方法名,与Jackson反序列化的字段匹配规则不兼容,具体触发逻辑如下:
- 原始手写代码的方法命名规则与Lombok默认生成规则存在偏差
原始代码为isSkippable字段手写了getisSkippable()、setisSkippable()方法,Jackson通过方法名解析出的JSON属性名为isSkippable,和数据库存储的JSON结构完全匹配。
Lombok对基本类型boolean字段的默认生成逻辑为:对字段isSkippable生成getter方法isSkippable(),setter自动去掉开头的is前缀,生成setSkippable()。Jackson按照Java Bean规范解析这两个方法时,会将对应的JSON属性名识别为skippable,遇到数据库存储的isSkippable字段时找不到匹配的绑定入口,直接抛出转换失败异常。 - Hibernate的
JsonStringType默认使用内置的ObjectMapper配置,未开启纯字段反射的反序列化逻辑,必须依赖可识别的getter/setter方法完成JSON字符串与实体对象的转换。
适配改造方案
不需要修改数据库已存储的JSON结构,只需显式指定Jackson的字段映射关系即可解决问题,改造后的DTO代码如下:
import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import java.io.Serializable; @NoArgsConstructor @Getter @Setter public class QuestionVariables implements Serializable { private ScreenOptions screenOptions; private QuestionOptions questionOptions; @NoArgsConstructor @Getter @Setter public static class ScreenOptions implements Serializable { // 显式绑定数据库存储的JSON字段名,绕开方法名解析的匹配偏差 @JsonProperty("isSkippable") private boolean isSkippable; } @NoArgsConstructor @Getter @Setter public static class QuestionOptions implements Serializable { } }
优化建议
- 可以直接用Lombok的
@Data注解替代@Getter、@Setter、@NoArgsConstructor的组合写法,减少重复注解,生成的方法完全符合Java Bean规范,可适配Jackson的解析逻辑。 - 建议全局配置Hibernate JSON类型使用项目内初始化完成的Jackson ObjectMapper实例,避免默认内置配置带来的解析规则偏差。
内容的提问来源于stack exchange,提问作者Anonguy123
相关产品推荐
相关产品推荐

