MapStruct:如何更新bean引用而不是属性值



Folks,

MapStruct有以下情况:我希望始终使用新实例更新字段,而不是在预先存在的实例中设置值。

示例:

class A {
     B fieldB;
}
class B {
     String fieldString;
}
class ADTO {
     BDTO fieldB;
}
class BDTO {
     String fieldString;
}

我使用MapStruct进行了以下映射:

void copy(ADTO aDTO, @MappingTarget A a);

生成的结果类似于:

if (aDTO.getFieldB()!= null) {
if (a.getFieldB() == null) {
a.setFieldB(new B());
}
bDTOToB(aDTO.getFieldB(), a.getFieldB());
} else {
a.setFieldB(null);
}

我想生成以下内容:

if (aDTO.getFieldB()!= null) {
a.setFieldB(new B());  // ALWAYS create a new B instance
bDTOToB(aDTO.getFieldB(), a.getFieldB());
} else {
a.setFieldB(null);
}

我补充说,我需要这两种行为:对于某些字段,当前行为适合我,也就是说,在现有实例中设置值。对于其他领域,我需要这种行为上的改变,正如我之前提到的(a.setFieldB(newB())(。

有可能做到吗?还有什么更好的策略?

唯一可能的方法是:


@BeforeMapping
default void init( @MappingTarget A a ) {
a.setFieldB( new B() );
}
void copy(ADTO aDTO, @MappingTarget A a);

@BeforeMapping将在检查之前设置您的字段。但是,它不会在生成的代码中对目标执行(现已过时(null检查。

在MapStruct中无法控制目标检查。NullValuePropertyMappingStrategy定义了应该如何在目标中处理空源。

最新更新