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
定义了应该如何在目标中处理空源。