我有以下代码:
public class EntityA {
private List<? extends AbstractObject> objects;
}
public class EntityB {
private List<? extends AbstractObjectDTO> dtos;
}
我有一个通用的映射器:
public interface GenericMapper<X extends AbstractObjectDTO, Y extends AbstractObject> {
Y mapDTOToEntity(X value);
X mapEntityToDTO(Y value);
}
@Mapper
public interface ConcreteMapper extends GenericMapper<ConcreteDTO, ConcreteObject> {}
在编译时会产生以下错误:
无法将属性“
List<? extends AbstractObject>
对象”映射到“ List<? extends AbstractObjectDTO>
dtos”。考虑声明/实现映射方法:“ List<? extends AbstractObjectDTO> map(List<? extends AbstractObject> value)
”。当我实现错误所示的map方法时,出现以下错误:
无法为通用类型变量源生成映射方法。
如何正确映射列表?
最佳答案
您可以实现自己想要的。
您需要具有以下方法:
List<AbstractObjectDto> map(List<? extends AbstractObject> value);
List<AbstractObject> mapDto(List<? extends AbstractObjectDto> value);
@ObjectFactory
default AbstractObjectDto createDto() {
return null; // implement your own logic
}
@ObjectFactory
default AbstractObject createEntity() {
return null; // implement your own logic
}
最重要的是MapStruct应该如何生成您正在映射的对象。 MapStruct在编译它们时会生成代码,因此您需要适当地实现。
如果要在运行时查找类型,则甚至需要执行以下操作:
default AbstrctObjectDto map(AbstractObject value) {
if (value instanceOf SomeObject) {
// invoke mapping for SomeObject
}
//else if and more
}
关于java - 具有抽象和通配符的Mapstruct,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45953847/