伙计,
使用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())
)改变行为。
有可能这样做吗?有什么更好的策略?
答案 0 :(得分:3)
唯一可行的方法是这样的:
@BeforeMapping
default void init( @MappingTarget A a ) {
a.setFieldB( new B() );
}
void copy(ADTO aDTO, @MappingTarget A a);
@BeforeMapping
将在检查前设置您的字段。但是,它将不忽略生成的代码中对目标的(现在已过时的)空检查。
无法控制MapStruct中的目标检查。 NullValuePropertyMappingStrategy
定义了应如何在目标中处理空源。