地图是否有可能自动检测包含通用类型作为源和目标的集合的映射



我最近拿起映射,我真的很喜欢它的工作方式。由于我是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;
};

我想知道是否有一种方法可以指导映射自动弄清楚它。我想念什么吗?

编辑:我乐观的方法是:

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

导致:

无法生成通用类型变量目标

的映射方法

谢谢

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

相关内容