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

Java Mapstruct扩展包含具有相同签名的方法的多个接口,java,spring,mapstruct,Java,Spring,Mapstruct,我在项目中使用了两个库,它们需要具有不同接口的映射器: public interface FirstLibraryMapper<T, M> { M mapToDto(T domain); List<M> mapToDto(List<T> domains); } public interface SecondLibraryMapper<T, M> { M mapToDto(T domain); } 通过使用@Na

我在项目中使用了两个库,它们需要具有不同接口的映射器:

public interface FirstLibraryMapper<T, M> {

    M mapToDto(T domain);

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

}

public interface SecondLibraryMapper<T, M> {

    M mapToDto(T domain);

}

通过使用@Named和@IterableMapping,我能够绕过这个问题,但它感觉错误和笨拙。为什么mapstruct processor不能忽略第二个方法,如果它具有与第一个完全相同的签名?我应该在他们的github页面上提出问题吗?或者我错了吗?

你可以有一个制图器。不应指定映射类型:

@Mapper
public interface Mapper {

    Dto1 mapToDto1(Domain1 domain1);

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

    Dto2 mapToDto2(Domain2 domain2);

}
@Mapper
公共接口映射器{
Dto1映射到1(域1域1);
列表映射到1(列表域1);
Dto2 MAPTOD2(域2域2);
}

<代码> > P>你是否考虑过在某种外观模式下组合两个映射器?

@Mapper
公共接口MyFirstMapper扩展了FirstLibraryMapper{
}
@制图员
公共接口MySecondMapper扩展了SecondLibraryMapper{
}
@服务
公共类MyMapperFacade扩展了FirstLibraryMapper、SecondLibraryMapper{
@自动连线
私人MyFirstMapper firstMapper;
@自动连线
私有mysecondapper第二映射器;
@凌驾
公共MyDto映射到(MyDomain域){
返回firstMapper.maptodo(域);//始终委托给FirstLibraryMapper
}
}

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

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

    @Override
    MyDto mapToDto(MyDomain domain);

}
@Mapper
公共接口MyMapper扩展了FirstLibraryMapper、SecondLibraryMapper{
@凌驾
MyDto映射到(MyDomain-domain);
}

问题是-FirstLibraryMapper和SecondLibraryMapper是两个不同库的接口,不应该相互耦合。碰巧我在同一个组件中使用了它们。@PashchenkoDenis我认为MapStruct没有这个功能。你应该给他们开罚单你的地图绘制者正在用相同的符号映射相同的对象?java怎么知道如何区分它们呢?
为什么mapstruct processor不能忽略它们。但为什么它应该忽视?尽管签名相同,但两种方法的行为可能不同。
MapStruct
如何选择您想要的具体内容?@NikolaiShevchenko如果我错了,请纠正我,但是如果在impl类中只有一个方法可以从两个接口访问,那么方法行为会有什么不同呢?是的,我选择了,但这需要复制映射,我希望避免它
@Mapper
public interface Mapper {

    Dto1 mapToDto1(Domain1 domain1);

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

    Dto2 mapToDto2(Domain2 domain2);

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

    @Override
    MyDto mapToDto(MyDomain domain);

}