0

我试图了解 Orika 何时使用转换器进行映射而不是直接转换。

我有以下映射:

Class A {
  Map<String, Object> props;

}

Class B {
   String bStr;
   int bInt;

}

我的映射定义为 props['aStr'] => bStr 和 props['aInt'] => bInt

当我查看生成的代码时,我看到对于 String 的情况,它使用一个转换器并调用它的 convert 方法进行转换:

destination.setBStr("" + ((ma.glasnost.orika.Converter)usedConverters[0]).convert(
        ((java.lang.Object) ((java.util.Map) source.getProps().get("aStr"),
        (ma.glasnost.orika.metadata.Type) usedTypes[0]))

但是,对于整数情况,它直接将其转换为:

 destination.setBInt((java.lang.Integer)(java.lang.Object) ((java.util.Map)
     source.getProps().get("aInt")))

上面的代码行最终给出了类转换异常。

为了解决这个问题,我一直在考虑使用自定义转换器,但如果上面的代码行不使用转换器,那么这将不起作用。

当然,我总是可以在我的自定义映射器中做到这一点,但只是想了解如何为类型转换生成代码。

谢谢!!

4

1 回答 1

5

在 Orika 中有两个阶段:配置时间和运行时,因为优化 Orika 在配置时间解析所有使用的转换器并将它们缓存到每个生成的映射器中,因此可以直接访问它 O(1) 但在配置时间它会尝试要在已注册转换器的列表 O(n) 中找到两个给定类型之间的一个“canConvert”,canConvert 是 Converter interface 中的一种方法。

因此,此解决方案提供了两全其美:

  • 一种非常灵活的方式来注册具有任意条件的转换器
  • 运行时的高效解析和转换操作。

Orika 默认情况下,利用每个对象中存在的 .toString 为每个对象提供对 String 的隐式强制。这里的问题是没有从对象到整数的转换器。

也许这可能是错误报告的问题。理想情况下,Orika 应该报告必须将 Object 转换为 Integer 并且没有注册适当的转换器。

于 2014-02-26T10:14:42.283 回答