繁体   English   中英

如何自定义lombok的superbuilder?

[英]How to customize lombok's superbuilder?

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

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

有谁知道如何覆盖该构造函数(或任何其他允许我在使用 SuperBuilder 注释构造我的 object 时调用 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());
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM