Lombok继承场景下@Builder无法解析builder()方法及@SuperBuilder适配问题
咱们先来拆解一下你遇到的核心问题:一是CardConfiguration类找不到builder()方法,二是改用@SuperBuilder后出现类型不匹配错误,而且要求完全不能修改Controller.java的代码,只能调整实体类。下面就一步步帮你搞定这些问题:
一、替换继承链类的@Builder为@SuperBuilder(解决builder()方法找不到的问题)
Lombok的普通@Builder注解天生不支持继承场景的Builder模式兼容,当你的类存在继承关系时,必须用专门为继承设计的@SuperBuilder注解。需要把继承链上的三个类全部替换注解,同时补充必要的构造注解:
1. 调整CardConfiguration类
把原来的@Getter @Setter @Builder替换为@Getter @Setter @SuperBuilder,再加上@NoArgsConstructor和@AllArgsConstructor(@SuperBuilder需要类有对应的构造方法支持,显式声明这两个注解可以避免和现有代码的构造方法冲突):
@Getter @Setter @SuperBuilder @NoArgsConstructor @AllArgsConstructor public class CardConfiguration { private String carId; private String carPassword; private List<CardType> cardType; // 这里要修改字段类型,看下面的类型匹配调整 private List<CardType> cardTypes; // 原来的是List<ProcessingAccountDto.CardType>,现在改成和Controller匹配的类型 // 原来的显式无参构造可以删掉,因为@NoArgsConstructor已经自动生成了 }
2. 调整ProcessingAccountDto类
同样把@Builder替换为@SuperBuilder,补充@NoArgsConstructor和@AllArgsConstructor。这个类继承了CardConfiguration,@SuperBuilder会自动处理父类的字段,不需要额外配置:
@SuperBuilder @NoArgsConstructor @AllArgsConstructor public class ProcessingAccountDto extends CardConfiguration { private String id; public String type; @JsonProperty("sourceAuthority") private SourceAuthority sourceAuthority; private CardConfiguration cardConfiguration; private List<CardType> cardTypes; // 保留原有的内部类、枚举、自定义方法(比如getCardConfiguration())不变 @Getter @Setter @Builder @AllArgsConstructor public static class CardType { public CardType() { } private ProcessingAccountDto.TypeOfCard type; private ApmAgreement revenueAgreement; } // 原有的枚举类(BatchSecurityOptions、ProcessingAccountType等)全部保留 }
3. 调整ProcessingAccountResource类
替换@Getter @Setter @Builder为@Getter @Setter @SuperBuilder,补充@NoArgsConstructor和@AllArgsConstructor:
@Getter @Setter @SuperBuilder @NoArgsConstructor @AllArgsConstructor public class ProcessingAccountResource extends ProcessingAccountDto { private String id; private ProcessingAccountDto cardConfiguration; // 原来的显式无参构造可以删掉,@NoArgsConstructor会自动生成 }
二、修正CardConfiguration的字段类型(解决@SuperBuilder后的类型不匹配问题)
你原来的CardConfiguration类中,cardTypes字段被错误声明为List<ProcessingAccountDto.CardType>,但Controller.java里的代码期望它返回List<CardType>(对应com.dto.CardType),这就是改用@SuperBuilder后出现类型错误的根源。
只需要把CardConfiguration的cardTypes字段类型修正为List<CardType>,这样Controller里的cardTypes变量类型和CardConfiguration的字段类型就完全匹配了,类型不兼容的错误会直接消失。
为什么这样调整能解决问题?
- @SuperBuilder解决继承场景的Builder生成问题:
@SuperBuilder会为每个继承类生成支持父类字段的Builder,同时自动生成静态的builder()方法,彻底解决找不到builder()的编译错误。 - 字段类型修正解决类型不匹配:调整
CardConfiguration的cardTypes字段类型后,Controller里的代码不需要任何改动,就能完美适配字段类型,不会再出现类型转换错误。 - 完全符合你的要求:所有调整都只修改实体类,没有碰过
Controller.java的一行代码。
现在你再编译运行代码,之前的两个核心错误都会消失啦~
内容来源于stack exchange

