[英]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.