我正在做一个 JBoss SEAM 项目,当我查看表单时出现此错误。
java.lang.ClassCastException:
it.cogitoweb.csi.entity.csiorelav.CsiTipoLav cannot be cast to
it.cogitoweb.csi.entity.csiorelav.CsiTipoLav
它总是与屏幕上显示的表单相关的同一个 JPA 类,我不明白为什么它是同一个类,这似乎是不可能的。
我正在做一个 JBoss SEAM 项目,当我查看表单时出现此错误。
java.lang.ClassCastException:
it.cogitoweb.csi.entity.csiorelav.CsiTipoLav cannot be cast to
it.cogitoweb.csi.entity.csiorelav.CsiTipoLav
它总是与屏幕上显示的表单相关的同一个 JPA 类,我不明白为什么它是同一个类,这似乎是不可能的。
当两个不同ClassLoader
的对象加载具有相同名称的类时,就会发生这种情况。Java 中两个类的相等性取决于完全限定名和加载它的类加载器。
因此,如果两个独立的类加载器从同一位置加载类,那么这些类型的对象将无法转换为彼此的类型,即使它们的类被称为相同。
正如 Joachim 之前解释的,java.lang.ClassCastException 通常发生在两个类加载器加载同名的类时。但是,我遇到了另一种可能发生这种情况的情况。
某些 IDE 会自动重新加载已修改的类,这可能会发生这种情况。在这种情况下,可能有旧版本的类保留在内存中导致 ClassCastException。
以下是您可以解决此问题的几种方法:
如果您正在编写自定义类加载器,则在加载类时,请确保基本/默认类加载器尚未加载该类的实例。
使正在加载的类成为默认类加载器已加载的类的子类。
使正在加载的类实现一个已由默认类加载器加载的接口。
这是因为该类已被两个不同的类加载器加载。你不能在它们之间施放。
您的应用程序中可能有一个副本CsiTipoLav
,并且这两个不同的副本是在不同的时间从不同的类加载器加载的。JBoss 在层次结构中有大量不同的类加载器,很容易让事情变得扭曲。
确保您只有一份课程副本。
就我而言,我有两个不同的 *.ear 并想从另一个加载一个类。所以我不得不隔离类加载器。我使用了这个描述:
http://www.thorgull.be/wiki/index.php?title=ClassLoader_isolation_in_JBOSS
它对我有用。
您尝试转换的对象由不同的类加载器加载,而不是加载您尝试转换的类的类加载器。