我具有以下mapstruct Mapper的实现
@Mapper
public interface MyMapper extends Serializable {
MyMapper INSTANCE = Mappers.getMapper(MyMapper.class);
//@Mapping(target = "status", source = "p1.status")
MergedPojosClass from(Pojo1 p1, Pojo2 p2);
}
在目标类中,我具有字段状态,但是在两个pojo类中都可以使用此字段。 对于我的pojo,我使用lombok生成设置器,获取器和所有构造函数。
没有注释行,我收到以下错误:
错误:(20,14)java:目标属性“状态”的几种可能的源属性。
我是否可以通过添加一些标注说Pojo1具有更高的优先级来避免出现上述样板(显式映射)? 我一直在研究Java文档以及mapstruct的源代码,但没有任何示例或线索可以对我的情况有所帮助。我试图通过InheritanceStrategy找到一些东西,但看起来很像mapstruct的内部概念。
答案 0 :(得分:0)
您可以尝试定义@MapperConfig
。不确定是否可以
像这样:
@MapperConfig
public interface MyConfig {
@Mapping(target = "status", source = "p1.status")
MergedPojosClass from(Pojo1 p1);
}
@Mapper(config = MyConfig.class, mappingInheritanceStrategy=MappingInheritanceStrategy.AUTO_INHERIT_ALL_FROM_CONFIG)
public interface MyMapper extends Serializable {
MyMapper INSTANCE = Mappers.getMapper(MyMapper.class);
// here's the doubt.. I'm not sure that in 2 arg mapping the config is used
MergedPojosClass from(Pojo1 p1, Pojo2 p2);
}
答案 1 :(得分:0)
如果要将多个相同类型的对象合并为一个,可以使用@MappingTarget
。但是,此方法会修改参数。如果要生成一个新对象,则需要这样的东西:
@Mapper(nullValuePropertyMappingStrategy = IGNORE)
public interface PojoMerger {
void copyNonNullProperties(@MappingTarget Pojo target, Pojo source);
default Pojo merge(Pojo... sources) {
Pojo merged = new Pojo();
for(Pojo source: sources) {
copyNonNullProperties(merged, source);
}
return merged;
}
}