Mapstruct расширяет несколько интерфейсов, содержащих метод с одинаковой подписью - PullRequest
2 голосов
/ 05 февраля 2020

Я использую в своем проекте 2 библиотеки, для которых требуются сопоставители с различными интерфейсами:

public interface FirstLibraryMapper<T, M> {

    M mapToDto(T domain);

    List<M> mapToDto(List<T> domains);

}

public interface SecondLibraryMapper<T, M> {

    M mapToDto(T domain);

}

Я хочу создать один компонент сопоставления с использованием mapstruct, который будет внедряться в компоненты библиотеки через интерфейс, поскольку оба интерфейса имеют метод с точной подписью:

@Mapper
public interface MyMapper extends FirstLibraryMapper<MyDomain, MyDto>, SecondLibraryMapper<MyDomain, MyDto> {

}

Когда я пытаюсь скомпилировать, я получаю эту ошибку:

Ambiguous mapping methods found for mapping collection element to MyDto: MyDto mapToDto(MyDomain arg0), MyDto mapToDto(MyDomain arg0).

Мне удалось обойти эту проблему с помощью @Named и @IterableMapping, но это неправильно и неуклюже. Почему процессор mapstruct не может игнорировать второй метод, если он имеет точную сигнатуру в качестве первого? Должен ли я поднять проблему на их странице GitHub? Или я не прав в этом случае?

Ответы [ 3 ]

2 голосов
/ 05 февраля 2020

Проблема решена путем переопределения метода в программе отображения результатов, который все еще немного неуклюж, но, кажется, делает свое дело.

@Mapper
public interface MyMapper extends FirstLibraryMapper<MyDomain, MyDto>, SecondLibraryMapper<MyDomain, MyDto> {

    @Override
    MyDto mapToDto(MyDomain domain);

}
1 голос
/ 05 февраля 2020

Рассматривали ли вы объединение обоих картографов в рамках какого-либо шаблона Facade?

@Mapper
public interface MyFirstMapper extends FirstLibraryMapper<MyDomain, MyDto> {
}

@Mapper
public interface MySecondMapper extends SecondLibraryMapper<MyDomain, MyDto> {
}

@Service
public class MyMapperFacade extends FirstLibraryMapper<MyDomain, MyDto>, SecondLibraryMapper<MyDomain, MyDto> {

    @Autowired
    private MyFirstMapper firstMapper;

    @Autowired
    private MySecondMapper secondMapper;

    @Override
    public MyDto mapToDto(MyDomain domain) {
        return firstMapper.mapToDto(domain); // always delegate to FirstLibraryMapper
    }
}
1 голос
/ 05 февраля 2020

Вы можете иметь один картограф. Не следует указывать типы сопоставления:

@Mapper
public interface Mapper {

    Dto1 mapToDto1(Domain1 domain1);

    List<Dto1> mapToDto1(List<Domain1> domains1);

    Dto2 mapToDto2(Domain2 domain2);

}
...