MapStruct 是否有可能自动检测包含泛型类型的集合的映射作为源和目标?
Is it possible for MapStruct to automatically detect mappings for Collections containing generic types as both source and target?
我最近学习了 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 是一个 Annotation Processor,它在编译期间生成代码。我们不生成任何反射检查(编译期间不知道所有实现和接口或扩展 class 的类型)。因此,您解决问题的方法是正确的。
我最近学习了 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 是一个 Annotation Processor,它在编译期间生成代码。我们不生成任何反射检查(编译期间不知道所有实现和接口或扩展 class 的类型)。因此,您解决问题的方法是正确的。