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);
}
我在我的项目中使用了 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);
}