具有抽象和通配符的 Mapstruct

Mapstruct with abstract and wildcard

我有以下代码:

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”。考虑declare/implement一个映射方法:“List<? extends AbstractObjectDTO> map(List<? extends AbstractObject> value)”.

当我按照错误中所示实施 map 方法时,出现以下错误: 无法为泛型类型变量源生成映射方法。

如何正确映射列表?

在 MapStruct 中,泛化工作使用 MapperConfig。

您需要像

那样定义 MapperConfig
@MapperConfig(mappingInheritanceStrategy=MappingInheritanceStrategy.AUTO_INHERIT_FROM_CONFIG)
public interface MapConfig{

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

}

并在您的映射器 class 中使用此配置,例如:

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

 //Concrete object mappings

}

我没有尝试过通用的东西,你可以用 MapperConfig 试试。

你可以实现你想要的。

您需要具备以下方法:

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 
}