簡體   English   中英

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 頁面上提出問題嗎? 或者在這種情況下我錯了?

您是否考慮過在某種 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM