当前位置: 首页 > 知识库问答 >
问题:

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

曾嘉福
2023-03-14

我最近学习了MapStruct,我真的很喜欢它的工作方式。由于我是MapStruct新手,如果这个问题很愚蠢或没有什么意义,我提前道歉。

由于服务器版本的原因,我被绑定到Java6。

我有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);

现在还行。

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);

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

谢谢。

共有1个答案

夹谷和韵
2023-03-14

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

 类似资料:
  • 问题内容: 如果我有一个通用类: 我想实例化几个项目,例如… …并将它们添加到集合中。如何定义集合,使其可以容纳泛型类型列表?然后,我想在某个时刻迭代集合,并使用Value属性。可能? 问题答案: 让您的泛型类从非泛型基类继承,或实现一个非泛型接口。然后,您可以拥有此类型的集合,并将其转换为用于访问集合内容的任何代码。 这是一个例子。

  • 我想将泛型类型<code>Y</code>的对象映射到另一个泛型类型为<code>X</code>的对象。在mapstruct中有这样的功能吗?或者我必须为通用映射编写自定义映射器吗?当我编译上面的代码时,会出现编译错误。

  • 问题内容: 在解决了之前的问题的基础上,但又导致了另一个问题。如果协议/类类型存储在集合中,则取回并实例化它们会引发错误。下面是一个假设的例子。该范例基于“程序到接口而不是实现”,“程序到接口” 编辑 -我当前的解决方法是遍历集合,但是由于api必须知道各种实现,所以这当然是有限的。另一个限制是这些类型的子类(例如PersianCat,GermanShepherd)将不会调用其重写的函数,否则我将

  • MapStruct:在映射到目标之前检查源的null。如果源为空,则需要从mapstruct接口引发自定义异常。

  • 我有一个场景,我必须使用Mapstrt将对象(来自网络请求)转换为对象(数据层)来处理对象映射。我正在尝试创建一个通用的接口,以防止必须为每个资源定义自定义映射器,如下所示: 但这会导致构建错误(但是编译成功): 错误:(13,4)错误:无法为泛型类型变量源生成映射方法。 这不可能吗?如果没有,我将不得不为每个创建一个自定义映射器,并使用根据类类型等告诉反序列化器要使用哪个映射器。。。它可能会变得

  • 问题内容: 我要实现以下功能: 如何检查向量元素类型? 请注意, 向量可能为空,因此我无法检查第一个元素是“ instanceof”整数还是String … 编辑: 好吧,我脑子里有个念头,我不知道它是否会起作用 我可以按以下方式实现checkType函数: 是否可以检查T是否为整数?! 提前致谢 问题答案: *由于 类型擦除, *泛型类型参数 在运行时不可恢复(某些特殊情况除外)。这意味着在运行