2

在一个实现中,org.dozer.BeanFactory.createBean(Object, Class<?>, String)我尝试将对象转换为它的类型。如果我部署所有捆绑包,即关闭并启动所有捆绑包,我会收到 ClassCastException:

java.lang.ClassCastException: de.xxx.Configuration cannot be cast to de.xxx.Configuration

我怀疑 karaf 和/或推土机的类加载器有问题。这个类在我的 jar 中只存在一次,并且没有被修改。配置没有实现可序列化并且没有序列版本 ID。

如何避免这个异常?

亲切的问候

4

3 回答 3

3

Spring devtools 是罪魁祸首。

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

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

有两种解决方案

  1. 通过简单地在 maven 或 gradle 中注释掉依赖项来禁用 devtools。
  2. 通过 META-INF/spring-devtools.properties 包括 dozer jar(根据您的情况的任何其他内容),如下所示,

restart.include.dozer=/dozer-5.5.1.jar

请注意,我使用的是 Intellij IDEA。

于 2018-04-04T04:57:12.430 回答
1

如果您有 SomeClass 无法转换为 SomeClass 的异常,则表明这两个类具有不同的类加载器。这意味着它是由两个不同的类加载器加载的。例如,如果你有包 A 和 B,都包含 SomeClass,那么每个类都是不同的,从包 A 加载的类的对象不能转换为从包 B 加载的类型。

由于您指出您将此类放在一个 jar 中,因此我建议您检查 lib/ 目录中是否没有额外的条目(推土机可以通过 sun.misc.AppClassLoader 加载它)。在 dozer BeanFactory 中放置断点并检查传递给 createBean 方法的对象实例类和类对象。然后,您应该使用捆绑类加载器。从那时起,解决问题就容易多了。

于 2013-09-04T07:55:17.197 回答
1

也许这个问题太老了,但是......你在你的开发中使用了像“spring-boot-devtools”这样的东西,它用“类加载器”来制作东西。

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

于 2017-06-08T07:01:07.223 回答