从mapstruct收到错误“目标属性的多个可能的源属性”时,如何避免显式映射?

时间:2019-10-04 09:23:02

标签: java lombok mapstruct

我具有以下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的内部概念。

2 个答案:

答案 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;
    }
}