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

gag*_*nbm 1 mapstruct

我想拥有一个Mapper同时包含createupdate方法的类。为create方法生成的代码很好,但是在更新的情况下,仅当源中的属性不为null时,我才想在目标中设置属性。

我该怎么做mapStruct

之所以会出现混乱,是因为nullValueMappingStrategyMapperMapping级别上定义。

如果我将该值设置为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);

}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

gag*_*nbm 7

完成了 @BeanMapping

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