Orika如何决定何时使用转换器

时间:2014-02-26 00:33:01

标签: mapping type-conversion orika

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

我有以下映射:

Class A {
  Map<String, Object> props;

}

Class B {
   String bStr;
   int bInt;

}

我的映射被定义为props ['aStr'] =&gt; bStr和道具['aInt'] =&gt; BINT

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

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

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

为了解决这个问题,我正在考虑使用自定义转换器,但如果上面的代码行没有使用转换器那么那就不行了。

当然,我总是可以在我的自定义映射器中执行此操作,但只是尝试了解如何为类型转换生成代码。

谢谢!

1 个答案:

答案 0 :(得分:4)

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

所以这个解决方案提供了两个世界中最好的:

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

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

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