如何自定义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());
}
我有一个现有的数据模型(不幸的是)是用双向关系编写的。目前,我正在尝试使用 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());
}