You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

抽象类@Jacksonized注解构建报错:Lombok与Jackson兼容方案咨询

解决抽象类使用Lombok @SuperBuilder + @Jacksonized的构建报错问题

这个问题的核心是Lombok 1.18.16中,@Jacksonized注解不能直接应用在抽象类的@SuperBuilder上——因为抽象类的Builder永远不会被直接实例化,Jackson无法利用它,从而触发构建报错。下面是保持AbstractOAuth2Token为抽象类、同时保留子类功能和Lombok+Jackson配合的解决方案:

步骤1:移除抽象类上的@Jacksonized注解

首先,把AbstractOAuth2Token上的@Jacksonized去掉,抽象类不需要这个注解,Jackson的序列化/反序列化逻辑应该绑定到具体子类上。调整后的抽象类代码如下:

@SuperBuilder
@JsonSubTypes({
    @JsonSubTypes.Type(value = OAuth2Token.class, name = "OAuth2Token"),
    @JsonSubTypes.Type(value = CachedOAuth2Token.class, name = "CachedOAuth2Token")
})
@Getter
@Setter
@ToString
public abstract class AbstractOAuth2Token {
    @JsonProperty("access_token")
    private String accessToken;
    @JsonProperty("token_type")
    private String tokenType;
}

步骤2:确保每个具体子类配置@Jacksonized和@JsonTypeName

@Jacksonized需要加到每个具体子类上,让Lombok生成的Builder能被Jackson正确识别;同时补上@JsonTypeName(如果之前没加的话),配合父类的@JsonSubTypes,Jackson可以根据类型标识正确反序列化为对应的子类。

修改后的OAuth2Token.java

@Getter
@Setter
@SuperBuilder
@ToString(callSuper = true)
@JsonTypeName("OAuth2Token")
@Jacksonized
public class OAuth2Token extends AbstractOAuth2Token {
    @JsonProperty("expires_in")
    private int expiresIn;
}

修改后的CachedOAuth2Token.java

@Getter
@Setter
@SuperBuilder
@ToString(callSuper = true)
@JsonTypeName("CachedOAuth2Token")
@Jacksonized
public class CachedOAuth2Token extends AbstractOAuth2Token {
    private LocalDateTime expirationDate;
}

额外配置(可选):指定Jackson类型识别字段

如果你的JSON数据中没有默认的@type字段来区分子类,可以在抽象类上添加@JsonTypeInfo来指定自定义的类型字段。例如,如果你想用token_type字段来区分:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "token_type")
@SuperBuilder
@JsonSubTypes({
    @JsonSubTypes.Type(value = OAuth2Token.class, name = "bearer"), // 假设OAuth2Token的token_type是bearer
    @JsonSubTypes.Type(value = CachedOAuth2Token.class, name = "cached_bearer")
})
// 其他注解...
public abstract class AbstractOAuth2Token {
    // 类内容...
}

为什么这样可行?

  • 移除抽象类的@Jacksonized解决了构建报错的根源,因为抽象类的Builder不会被直接使用,Jackson不需要它。
  • 子类的@Jacksonized保证了Lombok生成的Builder能和Jackson无缝配合,支持序列化/反序列化。
  • 抽象类依然保持抽象状态,且构造方法为protected,无法被直接实例化,符合你的设计需求。

内容的提问来源于stack exchange,提问作者Capitano Giovarco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 21:22:44