抽象类@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
相关产品推荐
相关产品推荐

