【问题标题】:Is it actually possible to use generics when defining mappings in Orika?在 Orika 中定义映射时实际上可以使用泛型吗?
【发布时间】:2020-05-29 18:02:35
【问题描述】:

我知道那种类型的擦除,并且在定义映射时会阻止使用泛型,因为这个问题指出了how to map generics objects with Orika?。但是Orika FAQ是否支持泛型部分声称:

是的。 Orika 通过一个特殊的 Type 类为泛型类型的映射提供特殊的运行时支持,该类可用于定义模板类型的确切类型元素。

理想情况下,应该像下面这样工作(假设我们可以通过一些 Orika 功能在运行时以某种方式维护类参数):

     mapperFactory.classMap(Asset<T,K>.class, AssetDto<K>.class)
    .maybeSomeCustomization...
    .byDefault()
    .register();

我找不到有关 Orika 常见问题解答中提到的 Type&lt;?&gt; 类用法的任何示例。

【问题讨论】:

  • 泛型类,例如Asset&lt;T,K&gt;.class 不存在,所以你不能那样做。
  • 是的,他们没有,我想了解替代方案,例如 Orika 常见问题解答中提到的。

标签: java orika


【解决方案1】:

有可能,您需要使用MapperFactory#classMap(Type&lt;A&gt;, Type&lt;B&gt;) API 而不是MapperFactory#classMap(Class&lt;A&gt;, Class&lt;B&gt;)

您可以在 generics 包的 Orika 测试中找到很多示例。

要构造Type 实例,您可以使用TypeBuilder 的就地匿名子类:

Type<MyGenericClass<GenericParam1, GenericParam2>> type =
    new TypeBuilder<MyGenericClass<GenericParam1, GenericParam2>>() {}.build();

注意创建匿名子类的构造函数后面的括号{}。这样 Orika 就可以使用 ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments() 找出实际的 MyGenericClass&lt;GenericParam1, GenericParam2&gt; 类型参数。

【讨论】:

  • 谢谢,这是有道理的,子类化以找出类型参数。 Orika FAQ 实际上可能指向您提到的单元测试。
【解决方案2】:

您可以使用TypeBuilder API 来保留泛型类型信息,以便 Orika 在执行映射时可以使用它。

请注意,Java 不允许我们在 Class 文字中指定类型参数。例如,我们不能写Asset&lt;Book&gt;.class。此外,由于类型擦除,我们无法在运行时访问实际的类型参数。简而言之,原始类型 - 即 Asset.class - 没有向 Orika 提供足够的信息。

所以首先,我们必须使用TypeBuilder 创建泛型类型:

Type<Asset<Person>> sourceType = new TypeBuilder<Asset<Person>>() {}.build();
Type<AssetDto<Person>> targetType = new TypeBuilder<AssetDto<Person>>(){}.build();

那么在classMap调用中,我们必须使用这些类型:

factory.classMap(sourceType, targetType).byDefault().register();

最后,我们可以使用这些类型执行映射:

factory.getMapperFacade().map(asset, sourceType, targetType);

阅读以下帖子了解generics usage with Orika的详细解释。

【讨论】:

    猜你喜欢
    • 2015-06-19
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    相关资源
    最近更新 更多