Как избежать явного отображения при получении ошибки «Несколько возможных исходных свойств для целевого свойства» от mapstruct? - PullRequest
1 голос
/ 04 октября 2019

У меня есть реализация 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. Для своих pojos я использую lombok для генерации сеттеров, геттеров и всевозможных конструкторов.

Без закомментированной строки я получаю следующую ошибку:

Ошибка: (20, 14) java: несколькоВозможные исходные свойства для целевого свойства "status".

Можно ли избежать вышеприведенного примера (явного отображения), добавив некоторую аннотацию о том, что Pojo1 имеет более высокий приоритет? Я изучал Javaдокументы, а также исходный код mapstruct, но без каких-либо примеров или подсказок, которые могли бы помочь в моем случае. Я пытался найти что-то с InheritanceStrategy, но это скорее похоже на внутреннюю концепцию mapstruct.

Ответы [ 2 ]

0 голосов
/ 10 октября 2019

Если вы хотите объединить несколько объектов одного типа в один, вы можете использовать @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;
    }
}
0 голосов
/ 05 октября 2019

Вы можете попытаться определить @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);
}
...