我希望有一个同时包含create
和update
方法的Mapper
类。为create方法生成的代码很好,但在更新的情况下,我希望设置目标中的属性,前提是它们在源代码中不为空。
我如何用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!!
}
有没有一种简单的方法,不用为创建和更新创建单独的映射器类?
发布于 2019-01-15 00:06:41
我用@BeanMapping
完成了
@BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE,
nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
void update(AmcPackageRequest amcPackageRequest, @MappingTarget AmcPackage amcPackage);
发布于 2020-09-05 16:59:07
全局配置
@MapperConfig(
componentModel = "spring",
nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE
)
public interface BaseMapperConfig {
}
现在,您的映射器开始运行:
@Mapper(config = BaseMapperConfig.class)
public interface SomeObjectMapper {
...
}
https://stackoverflow.com/questions/54174437
复制相似问题