如何自定义lombok的superbuilder?

How to customize lombok's superbuilder?

我有一个现有的数据模型(不幸的是)是用双向关系编写的。目前,我正在尝试使用 Lombok 重构它。我已经添加了 @SuperBuilder 注释,但生成的构建器不会调用我的自定义 setter 方法(确保双向性保持不变的方法)。

在 运行ning delombok 并调查生成的代码后,似乎在正在构建的 class 上创建了一个构造函数,该构造函数采用构建器的实例来设置值。不幸的是,它只是直接分配字段值。所以我想也许我可以自己实现该构造函数,并根据需要调用 setters。当然,这是行不通的。当我构建时出现错误,因为现在在我的 class 中显然有两个相同方法的实现(换句话说,SuperBuilder 实现了它,即使它已经在 class 中实现)。

有谁知道如何覆盖该构造函数(或任何其他允许我在使用 SuperBuilder 注释构造我的对象时调用 setter 的机制)?

编辑:按要求添加了代码

我正在尝试重构以使用 lombok 的实体 class 是:


@Entity
@Table(name = "APPLICATION_USER", uniqueConstraints = @UniqueConstraint(columnNames = { "PRINCIPAL_NAME", "APPLICATION", "SITE_ID" }))
@AttributeOverrides(@AttributeOverride(name = "id", column = @Column(name = "APP_USER_ID")))
@Filters({ @Filter(name = FilterQueryConstants.SITE_ID_FILTER_NAME, condition = FilterQueryConstants.SITE_ID_FILTER) })
@SuperBuilder
public class ApplicationUser extends User
{
    private static final long serialVersionUID = -4160907033349418248L;

    @Column(name = "APPLICATION", nullable=false)
    private String application;

    @ManyToMany(mappedBy = "applicationUsers", targetEntity = Group.class)
    @Filters({ @Filter(name = FilterQueryConstants.GROUP_FILTER_NAME, condition = FilterQueryConstants.GROUP_FILTER),
            @Filter(name = FilterQueryConstants.SITE_ID_FILTER_NAME, condition = FilterQueryConstants.SITE_ID_FILTER) })
    @MappingTransform(operation = DTOSecurityOperation.ASSIGN_GROUP)
    @Builder.Default
    private Set groups = new HashSet ( );

    // Other methods omitted for brevity

当我 运行 delombok 时,生成的构造函数如下所示:

protected ApplicationUser(final ApplicationUserBuilder b) {
    super(b);
    this.application = b.application;
    if (b.groups$set) this.groups = b.groups;
    else this.groups = ApplicationUser.$default$groups();
}

所以我想我可以基本上将这段代码复制到我的 ApplicationUser class 中并修改它以在它设置组值时调用我的 setter 方法(而不是仅仅进行直接赋值).我在想这样的事情:

protected ApplicationUser(final ApplicationUserBuilder b) {
    super(b);
    this.application = b.application;
    if (b.groups$set) this.setGroups(b.groups);
    else this.setGroups(ApplicationUser.$default$groups());
}

最初,在使用 1.18.8 时,我收到一个错误,指出此构造函数已存在。自从更新到 1.18.22,我现在得到这个:

error: cannot find symbol
        if (b.groups$set) this.setGroups(b.groups);
                                          ^
  symbol:   variable groups
  location: variable b of type ApplicationUserBuilder

自定义 @SuperBuilder 仅适用于较新的 lombok 版本;您应该始终使用最新版本,即撰写本答案时的 v1.18.22。

使用该版本,可以自定义 @SuperBuilder 构造函数。但是,您正在使用代码作为已使用 v1.18.8 删除的构造函数的基础。这不再适用于当前的 lombok 版本。 lombok v1.18.10 引入 @Default 字段的实际字段值存储在构建器中的 fieldName$value 字段中,而不仅仅是 fieldName.

因此,您的自定义构造函数必须如下所示:

protected ApplicationUser(final ApplicationUserBuilder<?, ?> b) {
    super(b);
    this.application = b.application;
    if (b.groups$set) this.setGroups(b.groups$value);
    else this.setGroups(ApplicationUser.$default$groups());
}