我有以下代码:

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/

10-11 19:45