在org.dozer.BeanFactory.createBean(Object, Class<?>, String)
的实现中,我尝试将对象转换为它的类型。如果我部署了所有的bundle,那就是关闭并启动所有bundle,我得到了ClassCastException:
java.lang.ClassCastException: de.xxx.Configuration cannot be cast to de.xxx.Configuration
我怀疑karaf和/或推土机的ClassLoader存在问题。 这个类只有一次存在于我的罐子中,并且它们没有被修改。 配置未实现可序列化且没有串行版本ID。
如何避免此异常?
亲切的问候
答案 0 :(得分:1)
也许是一个太老的问题,但是......你在开发中使用了类似&#34; spring-boot-devtools&#34;使用&#34;类加载器&#34;。
制作一些东西在我的情况下,调试dozer库做得很好,当库返回到我自己的类时映射的结果会抛出异常。
答案 1 :(得分:1)
Spring devtools是罪魁祸首。
在我的情况下,来自推土机映射的对象实例无法转换为相同类型的目标引用。
order.setPricingConfig(dozerBeanMapper.map(orderPricing, PricingConfig.class));
有两种解决方案
restart.include.dozer = /推土机-5.5.1.jar
请注意我使用的是Intellij IDEA。
答案 2 :(得分:0)
如果您有异常,SomeClass无法转换为SomeClass,则表明这两个类具有不同的类加载器。这意味着它由两个不同的类加载器加载。例如,如果你有包A和B,两者都包含SomeClass,那么每个类都是不同的,从bundle A加载的类的对象不能转换为从bundle B加载的类型。
由于您指的是在一个jar中有这个类,我建议检查lib /目录中是否没有额外的条目(dozer可以通过sun.misc.AppClassLoader加载它)。将断点放在dozer BeanFactory中并检查传递给createBean方法的对象实例类和类对象。然后,您应该使用捆绑类加载器。从那时起,修复问题就容易多了。