【问题标题】:Is it possible for MapStruct to automatically detect mappings for Collections containing generic types as both source and target?MapStruct 是否可以自动检测包含泛型类型作为源和目标的集合的映射?
【发布时间】:2017-09-05 12:48:05
【问题描述】:

我最近使用了 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);

结果:

无法为泛型类型变量目标生成映射方法

谢谢

【问题讨论】:

    标签: java generics mapping mapstruct


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2015-11-12
      • 1970-01-01
      • 1970-01-01
      • 2020-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-09
      • 1970-01-01
      相关资源
      最近更新 更多