我想使用一个Mapper
和create
方法的单个update
类。为create方法生成的代码很好,但是如果进行更新,则仅当源中的属性不为null时,我才想在目标中设置属性。
如何使用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!!
}
有没有一种简单的方法,而无需创建用于创建和更新的单独的映射器类?
答案 0 :(得分:3)
完成@BeanMapping
@BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE,
nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
void update(AmcPackageRequest amcPackageRequest, @MappingTarget AmcPackage amcPackage);
答案 1 :(得分:0)
全局配置
script
现在是您的映射器:
main.js