具有抽象和通配符的 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
}
我有以下代码:
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
}