【发布时间】:2020-02-05 10:14:43
【问题描述】:
我在我的项目中使用了 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,该映射器 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 正在映射具有相同签名的相同对象? java怎么知道区分它们?
-
Why can't mapstruct processor ignore。但为什么它应该忽略呢?尽管签名相同,但两种方法的行为可能不同。MapStruct会如何选择你到底想要什么? -
@NikolaiShevchenko 如果我错了,请纠正我,但是如果在 impl 类中只有一个方法可以从两个接口访问,那么方法行为有何不同?