Spring boot 使用Lombok';从第三方库扩展的类上的s@SuperBuilder概念

Spring boot 使用Lombok';从第三方库扩展的类上的s@SuperBuilder概念,spring-boot,lombok,Spring Boot,Lombok,我有如下的类层次结构 子-->父-->超级家长 由于子类扩展了父类类,我必须使用Lombok的@SuperBuilder注释,而不是@Builder。另外,据我所知,所有超类都需要有@SuperBuilder注释。但是在我的例子中,SuperParent类来自一个外部库,在这里我不能添加@SuperBuilder注释。我得到下面的编译错误 The constructor SuperParent(DocumentUploadedResponseDto.DocumentUploadedRespons

我有如下的类层次结构

子-->父-->超级家长

由于子类扩展了父类类,我必须使用Lombok的
@SuperBuilder
注释,而不是
@Builder
。另外,据我所知,所有超类都需要有
@SuperBuilder
注释。但是在我的例子中,SuperParent类来自一个外部库,在这里我不能添加
@SuperBuilder
注释。我得到下面的编译错误

The constructor SuperParent(DocumentUploadedResponseDto.DocumentUploadedResponseDtoBuilder<capture#1-of ?,capture#2-of ?>) is undefined.
构造函数超级客户端(DocumentUploadedResponseDto.DocumentUploadedResponseDtoBuilder)未定义。

有什么解决方案或替代方案吗?谢谢。

有点难看,但这是可能的。您必须在
Parent
SuperParent
之间的继承链中插入一个helper类;让我们称之为
SuperParentBuilderEnabler
。在这个类中,您必须手动实现所有必需的生成器元素。特别是,您必须为
SuperParent
中的字段编写所有setter方法。 这将允许
父类
子类
只使用
@SuperBuilder
注释,而无需进行任何进一步修改

我假设
SuperParent
有一个
intsuperparentfield
字段,只是为了演示如何在builder类中编写这样的setter方法。此外,我假设这个字段可以通过构造函数参数设置。以下是您必须做的:

公共抽象类SuperParentBuilderEnabler扩展了SuperParent{
公共静态抽象类SuperParentBuilderEnablerBuilder{
私人int superParentField;
公共B超级竞技场(int超级竞技场){
this.superParentField=superParentField;
返回自我();
}
受保护抽象B self();
公共抽象C build();
}
受保护的SuperParentBuilderEnabler(SuperParentBuilderEnabler b){
超级(b.superParentField);
}
}

现在让父级扩展SuperParentBuilderEnabler,您就完成了。

这有点难看,但这是可能的。您必须在
Parent
SuperParent
之间的继承链中插入一个helper类;让我们称之为
SuperParentBuilderEnabler
。在这个类中,您必须手动实现所有必需的生成器元素。特别是,您必须为
SuperParent
中的字段编写所有setter方法。 这将允许
父类
子类
只使用
@SuperBuilder
注释,而无需进行任何进一步修改

我假设
SuperParent
有一个
intsuperparentfield
字段,只是为了演示如何在builder类中编写这样的setter方法。此外,我假设这个字段可以通过构造函数参数设置。以下是您必须做的:

公共抽象类SuperParentBuilderEnabler扩展了SuperParent{
公共静态抽象类SuperParentBuilderEnablerBuilder{
私人int superParentField;
公共B超级竞技场(int超级竞技场){
this.superParentField=superParentField;
返回自我();
}
受保护抽象B self();
公共抽象C build();
}
受保护的SuperParentBuilderEnabler(SuperParentBuilderEnabler b){
超级(b.superParentField);
}
}

现在让
Parent扩展SuperParentBuilderEnabler
你就完成了。

它要求所有超类也有@SuperBuilder注释它要求所有超类也有@SuperBuilder注释hmm…如果没有其他解决方案,我想我将不得不尝试你的“丑陋”但很好的解决方案。今天我实现了你的解决方案这是完美的工作。非常感谢您的帮助。嗯……如果没有其他解决方案,我想我将不得不尝试您的“丑陋”但很好的解决方案。今天我实现了您的解决方案。这是完美的工作。非常感谢你的帮助。