MapStruct - 如何为不同的映射方法设置不同的空策略?
MapStruct - How to set different null strategy for different mapping methods?
我想要一个 Mapper
class 同时具有 create
和 update
方法。创建方法的生成代码很好,但是在更新的情况下,我想在目标中设置属性,前提是它们在源中不为空。
如何使用 mapStruct
进行操作?
出现混淆是因为 nullValueMappingStrategy
被定义在 Mapper
或 Mapping
级别。
如果我将该值设置为 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!!
}
有没有一种简单的方法可以做到这一点而无需为创建和更新创建单独的映射器 classes?
@BeanMapping
完成了
@BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE,
nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
void update(AmcPackageRequest amcPackageRequest, @MappingTarget AmcPackage amcPackage);
我想要一个 Mapper
class 同时具有 create
和 update
方法。创建方法的生成代码很好,但是在更新的情况下,我想在目标中设置属性,前提是它们在源中不为空。
如何使用 mapStruct
进行操作?
出现混淆是因为 nullValueMappingStrategy
被定义在 Mapper
或 Mapping
级别。
如果我将该值设置为 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!!
}
有没有一种简单的方法可以做到这一点而无需为创建和更新创建单独的映射器 classes?
@BeanMapping
@BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE,
nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
void update(AmcPackageRequest amcPackageRequest, @MappingTarget AmcPackage amcPackage);