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

如何用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复用的核心,它会自动处理基类和子类的字段,生成包含所有字段的链式Builder
  • builderMethodName = "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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 07:15:38