我们目前正在一个大型应用程序中实现Lombok的实现,主要我们希望受益的优势之一就是使用@Builder。
为此,我们在 Spring boot 3.2.4 中实现了 Lombok 1.18.30 版本,结合 Mapstruct 1.5.5.Final 以及相应的依赖项来实现它们 lombok-mapstruct-binding:0.2.0。
我们遇到的问题来自于映射器的生成。这些会覆盖类属性的初始化值。例如:
@Column(name = "my_class_attribute",
columnDefinition = "double default 4250")
private double my_class_attribute = 4250;
构建映射器如下:
@Override
public MyEntity toEntity(MyDataTransferObject source) {
if ( source == null ) {
return null;
}
MyEntity.MyEntityBuilder myEntity = MyEntity.builder();
最后一行
myEntity.builder();
是写入初始化默认值的行。
作为一个具有大量代码的应用程序,我们认为使用 @Builder.Default 注释那些具有初始化值的属性是不可维护的,也不是真正安全的。这会引起很大的误差范围,无法在编译时检查。
我们已经审查了其他选项,但我们没有看到任何可以全局服务的选项,例如在 lombok.config 配置文件中声明的选项。知道如何解决这个问题吗?非常感谢您提前抽出时间并提供帮助。
就您而言,我建议您也在现场使用
@Builder.Default
:
@Builder.Default
@Column(name = "my_class_attribute",
columnDefinition = "double default 4250")
private double my_class_attribute = 4250;
以及注释中映射器类的上方
@Mapper
:
@Mapper(nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
interface YourMapper {
MyEntity toEntity(MyDataTransferObject source);
}
在这种情况下,如果目标对象的字段为 null,则映射器类不会使用 set 方法,而 Builder 则会将默认值插入到该字段中