如何用Lombok @Builder实现含必填source的Spring事件继承类构建
实现Spring ApplicationEvent层级的Lombok Builder方案
完全可行,利用Lombok的@SuperBuilder注解配合自定义静态入口方法,就能实现你想要的「先传入必填source,再链式设置可选字段」的Builder API,无需手写大量Builder代码,且能在子类中复用基类的字段和Builder逻辑。
具体实现步骤
1. 抽象基类 TrackedEvent
继承ApplicationEvent,定义通用可选字段,通过@SuperBuilder实现Builder继承,并提供接收source的静态入口:
import org.springframework.context.ApplicationEvent; import lombok.Getter; import lombok.experimental.SuperBuilder; @Getter @SuperBuilder(builderMethodName = "internalBuilder") public abstract class TrackedEvent extends ApplicationEvent { // 通用可选字段 private final String correlationId; private final String description; // 必须显式定义构造器,调用父类ApplicationEvent的source构造器 protected TrackedEvent(Object source, String correlationId, String description) { super(source); this.correlationId = correlationId; this.description = description; } // 对外暴露的静态Builder入口,接收必填的source参数 public static TrackedEventBuilder<?, ?> builder(Object source) { return internalBuilder().source(source); } }
2. 子类 OperationalEvent
继承TrackedEvent,添加自身业务字段,同样使用@SuperBuilder并实现静态入口:
import lombok.Getter; import lombok.experimental.SuperBuilder; @Getter @SuperBuilder(builderMethodName = "internalBuilder") public class OperationalEvent extends TrackedEvent { // 子类专属可选字段 private final OperationType operationType; private final OperationalStatus operationStatus; // 调用父类构造器,传递source及基类字段 protected OperationalEvent(Object source, String correlationId, String description, OperationType operationType, OperationalStatus operationStatus) { super(source, correlationId, description); this.operationType = operationType; this.operationStatus = operationStatus; } // 子类的静态Builder入口,确保传入source后能链式设置所有字段(含基类) public static OperationalEventBuilder<?, ?> builder(Object source) { return internalBuilder().source(source); } // 业务枚举示例 public enum OperationType { CREATE, UPDATE, DELETE } public enum OperationalStatus { SUCCESS, FAILURE, IN_PROGRESS } }
使用示例
完全符合你期望的API风格:
// 从当前类实例传入source,链式设置可选字段 OperationalEvent opsEvent = OperationalEvent.builder(this) .description("something happened") .operationStatus(OperationalEvent.OperationalStatus.SUCCESS) .operationType(OperationalEvent.OperationType.CREATE) .correlationId("abc-123-xyz") .build();
关键细节说明
@SuperBuilder:是实现父子类Builder复用的核心,它会自动处理基类和子类的字段,生成包含所有字段的链式BuilderbuilderMethodName = "internalBuilder":隐藏Lombok默认生成的无参builder方法,强制通过我们自定义的builder(Object source)入口创建Builder,确保必填的source不会被遗漏- 构造器定义:由于
ApplicationEvent仅提供带source的构造器,子类必须显式调用父类构造器传递source,Lombok的@SuperBuilder会自动匹配构造器参数生成Builder逻辑 - 兼容性:Java 11、Spring Boot及Lombok 1.18.4+版本完全支持该方案
内容的提问来源于stack exchange,提问作者hotmeatballsoup
相关产品推荐
相关产品推荐

