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

bsa*_*sam 0 mapping type-conversion orika

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

我有以下映射:

Class A {
  Map<String, Object> props;

}

Class B {
   String bStr;
   int bInt;

}
Run Code Online (Sandbox Code Playgroud)

我的映射定义为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]))
Run Code Online (Sandbox Code Playgroud)

但是,对于整数情况,它将直接像这样进行转换:

 destination.setBInt((java.lang.Integer)(java.lang.Object) ((java.util.Map)
     source.getProps().get("aInt")))
Run Code Online (Sandbox Code Playgroud)

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

为了解决此问题,我一直在考虑使用自定义转换器,但是如果上面的代码行不使用转换器,那将无法正常工作。

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

谢谢!!

Sid*_*idi 5

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

因此,此解决方案提供了两个方面的优势:

  • 在任意条件下注册转换器的一种非常灵活的方法
  • 运行时中有效的解析和转换操作。

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

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

  • 我遇到了一个类似的问题,通过本示例解决了这个问题,但是后来发现我可以设置fieldMap(“ a”,“ b”)。aElementType(String.class).add()来提示A的类型,而不必推出自定义转换器。 (2认同)