Mapstruct与抽象和通配符

时间:2017-08-30 06:54:15

标签: java mapstruct

我有以下代码:

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方法时,我遇到以下错误: 无法为通用类型变量源生成映射方法。

如何正确映射列表?

2 个答案:

答案 0 :(得分:0)

在MapStruct中,使用MapperConfig进行泛化。

您需要定义MapperConfig,如

@MapperConfig(mappingInheritanceStrategy=MappingInheritanceStrategy.AUTO_INHERIT_FROM_CONFIG)
public interface MapConfig{

  AbstractObject mapToObject(AbstractObjectDTO dto);
  AbstractObjectDTO mapToDTO(AbstractObject ob);

}

在mapper类中使用此配置,如:

@Mapper(config=MapConfig.class)
public interface YourMapperinterfacce{

 //Concrete object mappings

}

我没有尝试过泛型,你可以试试MapperConfig。

答案 1 :(得分:0)

你可以实现你想要的目标。

您需要具备以下方法:

"Cannot read keys when either application does not have a console or when console input has been redirected. Try Console.Read."

最重要的是MapStruct应该如何生成您要映射的对象。 MapStruct在编译期间生成代码,因此您需要适当地实现它。

如果你想在运行时找到类型,你甚至需要做类似的事情:

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
}