如何解决java.lang.ClassCastException:

时间:2011-08-19 04:46:25

标签: class exception casting

我正在使用一些第三方jar文件,还有很多Jar文件,我有其他人编写的代码。 执行时,我发现了这个错误:

  

java.lang.ClassCastException:org.apache.axis.client.Service无法强制转换为org.apache.axis.client.Service

你能告诉我可能是什么问题吗?

感谢您的回复。

但在收到此错误之前,我得到了:

  

java.lang.LinkageError:加载器约束违规:解析方法时“org.onvif.www.ver10.device.wsdl.DeviceBindingStub。(Ljava / net / URL; Ljavax / xml / rpc / Service;)V”当前类的类加载器(org / apache / catalina / loader / WebappClassLoader的实例),com / abcd / efgh / ijkl / device / onvif / DeviceHandlerClient,以及类加载器(org / apache / catalina / loader / StandardClassLoader的实例) )对于已解析的类,org / onvif / www / ver10 / device / wsdl / DeviceBindingStub,对于签名中使用的javax / xml / rpc / Service类型具有不同的Class对象。

问题尚未解决。我没有得到files/jar版本不匹配的地方。我手动包含了一些罐子。

1 个答案:

答案 0 :(得分:2)

您可能会从两个不同的类加载器中获取Service类。类标识是其名称和加载类的类加载器的组合。

作为一个人为的例子,你可以在像Tomcat这样的东西上部署两个web应用程序。它们每个都有一个相同jar的副本,每个都加载它们自己的类实例。但是,由于它们处于单独的WAR中,因此它们各自具有不同的类加载器。

接下来,假设你有一些全局的东西,比如缓存库或其他东西。这个缓存模块的jar不在单个WAR中,而是在容器的系统类路径上,这样两个WAR都可以看到它。

Web应用程序1将类的实例存储到缓存中,然后Web应用程序2尝试加载该实例并将其强制转换为其本地版本的类。但由于它来自其他Web应用程序,因此它具有与Web应用程序2不同的类加载器。因此,当它试图转换实例时,它会失败,因为它不是该应用程序2的那个类的版本。

所以,基本上,你在这里遇到了某种类加载器混乱。确保您清楚地了解您正在使用的罐子,确保没有任何不必要的重复,以及加载哪些类的上下文。