MapStruct是否可以自动检测包含作为源和目标的泛型类型的集合的映射?

问题描述:

我最近拿起MapStruct,我真的很喜欢它的工作方式。由于我是MapStruct的新手,如果这个问题很愚蠢或者毫无意义,我很抱歉。MapStruct是否可以自动检测包含作为源和目标的泛型类型的集合的映射?

由于服务器版本,我不能不的Java 6

我有3种类型的实体,A,B和C,以及他们的DTO同行。

public class A{ 
    //... 
} 
public class B extends A{ 
    //... 
} 
public class C extends A{ 
    //... 
} 

public class ADto{ 
    //... 
} 
public class BDto extends ADto{ 
    //... 
} 
public class CDto extends ADto{ 
    //... 
} 

我的映射器定义:

public abstract ADto mapAToADto(A source); 

public abstract A mapADtoToA(ADto source); 

public abstract BDto mapBToBDto(B source); 

public abstract B mapBDtoToB(BDto source); 

public abstract CDto mapCToCDto(C source); 

public abstract C mapCDtoToC(CDto source); 

这对于现在工作得很好。

在我的申请中,我使用了List<A>List<ADto>,其中包含两种子类型。

我目前的实现是实现我自己的映射方法,它遍历源列表并使用instanceof检查类型,然后调用上面列出的匹配映射方法。

当前实现:

public <T extends ADto, S extends A> List<T> toList(List<S> source) { 
if (source == null) { 
    return null; 
} 

List<T> list = new ArrayList<T>(); 
for (S entity : source) { 
    if (entity instanceof B) { 
     list.add((T) mapBToBDto((B) entity)); 
    } else if (entity instanceof C) { 
     list.add((T) mapCToCDto((C) entity)); 
    } else { 
     list.add((T) mapADtoToA((A) entity)); 
    } 
} 

return list; 
}; 

我想知道如果有一种方法可以直接MapStruct自动看着办吧。我错过了什么吗?

编辑: 我的乐观态度是有:

@IterableMapping(nullValueMappingStrategy = NullValueMappingStrategy.RETURN_NULL) 
public abstract <T extends ADto, S extends A> List<T> listAToADto(List<S> source); 

导致:

无法生成一个泛型类型变量目标

谢谢映射方法

您的实施配置是正确的。 MapStruct是一个注释处理器,可在编译期间生成代码。我们不会生成任何反射检查(在编译过程中,所有实现和接口或扩展类的类型都是未知的)。因此你对这个问题的解决方法是正确的。

+0

我只想知道,谢谢。 –