Mapstruct 扩展包含具有相同签名的方法的多个接口

Mapstruct extending multiple interfaces containing method with the same signature

我在我的项目中使用了 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 创建一个映射器 bean,它将通过接口注入到库组件中,因为两个接口都有一个具有精确签名的方法:

@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 页面上提出问题吗?还是我错了?

您可以拥有一个映射器。您不应指定映射类型:

@Mapper
public interface Mapper {

    Dto1 mapToDto1(Domain1 domain1);

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

    Dto2 mapToDto2(Domain2 domain2);

}

您是否考虑过在某种 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
    }
}

通过重写结果映射器中的方法解决了问题,该方法仍然有点笨拙,但似乎可以解决问题。

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

    @Override
    MyDto mapToDto(MyDomain domain);

}