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

Mapping Orika如何决定何时使用转换器,mapping,type-conversion,orika,Mapping,Type Conversion,Orika,我试图了解Orika何时使用转换器来进行映射和直接投射 我有以下映射: Class A { Map<String, Object> props; } Class B { String bStr; int bInt; } 但是,对于integer情况,它直接按如下方式强制转换: destination.setBInt((java.lang.Integer)(java.lang.Object) ((java.util.Map) source.getPr

我试图了解Orika何时使用转换器来进行映射和直接投射

我有以下映射:

Class A {
  Map<String, Object> props;

}

Class B {
   String bStr;
   int bInt;

}
但是,对于integer情况,它直接按如下方式强制转换:

 destination.setBInt((java.lang.Integer)(java.lang.Object) ((java.util.Map)
     source.getProps().get("aInt")))
上面的代码行最后给出了类强制转换异常

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

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


谢谢

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

因此,此解决方案提供了两个世界中最好的一个:

  • 在任意条件下注册转换器的一种非常灵活的方法
  • 运行时中的高效解析和转换操作
Orika默认情况下,利用每个对象中.toString的存在,为每个对象的字符串提供隐式强制。这里的问题是没有从对象到整数的转换器


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

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

因此,此解决方案提供了两个世界中最好的一个:

  • 在任意条件下注册转换器的一种非常灵活的方法
  • 运行时中的高效解析和转换操作
Orika默认情况下,利用每个对象中.toString的存在,为每个对象的字符串提供隐式强制。这里的问题是没有从对象到整数的转换器


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

感谢您的快速响应!我有一个StringToInteger转换器,它扩展了CustomConverter基类。我已在全球注册了此转换器,但它从未生效。Orika是如何决定是使用默认的.toString()还是使用转换器的?正如我所说,它迭代所有已注册的转换器并调用.canConvert()来验证转换器是否可以处理该情况(源类型和目标类型)。在这种情况下,您应该使用ObjectInteger转换器,而不是StringToIntegerThank!使用Object to Integer Converter为我解决了这个问题。我遇到了一个类似的问题,用这个例子解决了它,但后来发现我可以改为设置fieldMap(“a”,“b”).aElementType(String.class).add()来提示a的类型,而不必滚动自定义转换器。感谢您的快速响应!我有一个StringToInteger转换器,它扩展了CustomConverter基类。我已在全球注册了此转换器,但它从未生效。Orika是如何决定是使用默认的.toString()还是使用转换器的?正如我所说,它迭代所有已注册的转换器并调用.canConvert()来验证转换器是否可以处理该情况(源类型和目标类型)。在这种情况下,您应该使用ObjectInteger转换器,而不是StringToIntegerThank!使用Object to Integer Converter为我解决了这个问题。我遇到了一个类似的问题,用这个例子解决了它,但后来发现我可以改为将fieldMap(“a”,“b”).aElementType(String.class).add()设置为提示a的类型,而不必滚动自定义转换器。
 destination.setBInt((java.lang.Integer)(java.lang.Object) ((java.util.Map)
     source.getProps().get("aInt")))