[英]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 頁面上提出問題嗎? 或者在這種情況下我錯了?
您是否考慮過在某種 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);
}
你可以有一個映射器。 您不應指定映射類型:
@Mapper
public interface Mapper {
Dto1 mapToDto1(Domain1 domain1);
List<Dto1> mapToDto1(List<Domain1> domains1);
Dto2 mapToDto2(Domain2 domain2);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.