You need to enable JavaScript to run this app. DTO类消除getter/setter样板代码 使用Lombok注解报错解决
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.26 05:06:07