MapStruct-如何为不同的映射方法设置不同的null策略?

时间:2019-01-14 00:15:50

标签: mapstruct

我想使用一个Mappercreate方法的单个update类。为create方法生成的代码很好,但是如果进行更新,则仅当源中的属性不为null时,我才想在目标中设置属性。

如何使用mapStruct来做到这一点?

由于nullValueMappingStrategy是在MapperMapping级别上定义而引起的。

如果我将该值设置为Mapper,它将应用于所有方法,包括创建和更新。

@Mapper // If I define null strategy here, it will be applied to all methods
public interface AmcPkgMapper {

    AmcPkgMapper MAPPER = Mappers.getMapper(AmcPkgMapper.class);

    AmcPackage create(AmcPackageRequest amcPackageRequest);

    // How to define the null strategy here??
    void update(AmcPackageRequest amcPackageRequest, @MappingTarget  AmcPackage amcPackage);

}

如果我使用Mapping在方法上设置它,那么它期望我定义一个target对象,为此我可能需要一个包装对象,并以某种方式映射其中的所有内部属性。

@Mapping(target = "amcPackage", nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)
void update(AmcPackageRequest amcPackageRequest, @MappingTarget AmcPackageWrapper amcPackageWrapper);

使用上述方法,生成的代码如下所示,该代码无需进入amcPackage来设置所有属性。

@Override
public void update(AmcPackageRequest amcPackageRequest, AmcPackageWrapper amcPackageWrapper) {
    if ( amcPackageRequest == null ) {
        return;
    }
// nothing is mapped actually!!
}

有没有一种简单的方法,而无需创建用于创建和更新的单独的映射器类?

2 个答案:

答案 0 :(得分:3)

完成@BeanMapping

@BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE,
            nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
void update(AmcPackageRequest amcPackageRequest, @MappingTarget AmcPackage amcPackage);

答案 1 :(得分:0)

全局配置

script

现在是您的映射器:

main.js