Lombok 中的 @Builder 使用 Mapstruct 覆盖类属性默认值

问题描述 投票:0回答:1

我们目前正在一个大型应用程序中实现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 配置文件中声明的选项。知道如何解决这个问题吗?非常感谢您提前抽出时间并提供帮助。

java spring-boot lombok mapstruct
1个回答
0
投票

就您而言,我建议您也在现场使用

@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 则会将默认值插入到该字段中

© www.soinside.com 2019 - 2024. All rights reserved.