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

时间:2020-04-09 20:29:38

标签: mapstruct

伙计,

使用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()))改变行为。

有可能这样做吗?有什么更好的策略?

1 个答案:

答案 0 :(得分:3)

唯一可行的方法是这样的:


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

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

@BeforeMapping将在检查前设置您的字段。但是,它将忽略生成的代码中对目标的(现在已过时的)空检查。

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