通过强制转换为owe类型的ClassCastException

时间:2013-08-07 11:09:09

标签: classloader classcastexception dozer apache-karaf

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。

如何避免此异常?

亲切的问候

3 个答案:

答案 0 :(得分:1)

也许是一个太老的问题,但是......你在开发中使用了类似&#34; spring-boot-devtools&#34;使用&#34;类加载器&#34;。

制作一些东西

在我的情况下,调试dozer库做得很好,当库返回到我自己的类时映射的结果会抛出异常。

答案 1 :(得分:1)

Spring devtools是罪魁祸首。

在我的情况下,来自推土机映射的对象实例无法转换为相同类型的目标引用。

order.setPricingConfig(dozerBeanMapper.map(orderPricing, PricingConfig.class));

有两种解决方案

  1. 只需在maven中注释掉依赖项即可禁用devtools gradle这个。
  2. 包括推土机罐(根据您的具体情况而定)     通过META-INF / spring-devtools.properties,如下所示,
  3.   

    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方法的对象实例类和类对象。然后,您应该使用捆绑类加载器。从那时起,修复问题就容易多了。