Java Comparator抛出奇怪的ClassCastException:无法将pkg.MyClass强制转换为pkg.MyClass

Java Comparator抛出奇怪的ClassCastException:无法将pkg.MyClass强制转换为pkg.MyClass,java,jsf-2,entity,comparator,classcastexception,Java,Jsf 2,Entity,Comparator,Classcastexception,在viewscoped托管bean中,我使用一个比较器按Date类型的属性对列表进行排序 问题是我一直得到ClassCastException,如下所示- java.lang.ClassCastException:pkg.db.BaseArStatus无法强制转换为pkg.db.BaseArStatus 为什么它不能将BaseArStatus投给BaseArStatus?是因为BaseArStatus是一个实体吗 这个问题对我来说真的很奇怪,因为我并不是每次都遇到异常。在构建和部署应用程序时,它

在viewscoped托管bean中,我使用一个比较器按Date类型的属性对列表进行排序

问题是我一直得到ClassCastException,如下所示-

java.lang.ClassCastException:pkg.db.BaseArStatus无法强制转换为pkg.db.BaseArStatus

为什么它不能将BaseArStatus投给BaseArStatus?是因为BaseArStatus是一个实体吗

这个问题对我来说真的很奇怪,因为我并不是每次都遇到异常。在构建和部署应用程序时,它大部分都运行良好,并没有任何问题,但有时即使我正在做同样的事情——构建和部署,它也会在运行时失败,并出现ClassCastException

为什么这只是偶尔发生而不是一直发生?是因为我在托管bean中使用它吗

这就是托管bean的外观-

@ManagedBean @视域 公共类MyBean{ @PersistenceContextunitName=myPU 私人实体管理者; 公共空间法{ List basList=this.fetchAllBaseArStatus; Collections.sortbasList,新的Comparator{ @凌驾 公共内部比较状态o1,BaseArStatus o2{ 返回o1.getMonthDate.compareToo2.getMonthDate; } }; //... 以及BaseArStatus实体-

@实体 @Tablename=基本状态 @命名查询{ @NamedQueryname=BaseArStatus.findAll,query=SELECT b FROM BaseArStatus b} 公共类BaseArStatus实现可序列化{ 私有静态最终长serialVersionUID=1L; @身份证 @GeneratedValuestrategy=GenerationType.IDENTITY @基本选项=假 @NotNull @Columnname=id 私有整数id; @基本选项=假 @NotNull @Columnname=月份\日期 @TemporalType.DATE 私人约会月日; @基本选项=假 @NotNull @Columnname=ar\u计数 私人双弧山; @Sizemax=50 @Columnname=用户id 私有字符串用户标识; @Columnname=上次更新日期 @Temporaltype.TIMESTAMP 私人日期最后更新日期; 公共BaseArStatus{} //...
两个不同的类加载器正在加载该类的两个不同副本。当熟悉该类的一个副本的客户机代码获得一个对象,该对象是该类的另一个副本的实例时,这就是您得到的


这个问题只有在两个类加载器都加载了类的情况下才会发生。这会使它看起来像是间歇性的;根据您通常无法控制的事件,其中一个类加载器可能加载了类,也可能没有加载。根据我的经验,这是Java EE编程中最常见的问题,当然,这就是您正在做的ng.

两个不同的类加载器正在加载该类的两个不同副本。当熟悉该类的一个副本的客户机代码获得一个对象,该对象是该类的另一个副本的实例时,您将得到该对象


这个问题只有在两个类加载器都加载了类的情况下才会发生。这会使它看起来像是间歇性的;根据您通常无法控制的事件,其中一个类加载器可能加载了类,也可能没有加载。根据我的经验,这是Java EE编程中最常见的问题,当然,这就是您正在做的ng.

听起来绝对像是不同类加载器加载的类之间的比较。您可以使用Class.getClassLoader方法为我们确认拒绝。捕获异常并打印classA.getClassLoader==classB.getClassLoader。

听起来绝对像是不同类加载的类之间的比较sLoaders。您可以使用Class.getClassLoader方法为我们确认是否拒绝。捕获异常并打印classA.getClassLoader==classB.getClassLoader。

我想知道是否涉及多个ClassLoader…如果您提供一些关于问题的额外上下文,可能重复的可能会有所帮助em.您的应用程序是否部署到servlet容器中?@frankjl:这是一个web应用程序。部署在Glassfish 3.1中。我想知道是否涉及多个类加载器…如果您提供一些额外的问题上下文,它的可能副本可能会有所帮助。您的应用程序是否部署到servlet容器中?@frankJL:这是一个Web应用程序。部署在GalsFix3.1中,有没有办法解决这两个不同的类加载器问题?问题不是两个不同的类加载器——它是BaseStuts.C类的两个不同副本。考虑BaseLoad实例来自何处。它可能来自一个Web应用程序,它有自己的jar文件副本。s在中定义-可能甚至是jar的不同版本。如果没有其他版本起作用,请查看部署中的多个.class文件副本,包括WAR、EAR、jar。这将为您提供线索。因为现在问题已经解决。我已经对
r 10个不同的实体。在我处理完每一个实体之后,我部署了这场战争,大约有4个实体遇到了这个问题。我仍然需要对另外10个实体重复相同的过程,我非常确定我会再次得到该异常。我将检查WAR文件。部署后是否重新启动服务器?如果没有,那就是问题所在-服务器内存中有一个.class的热旧拷贝。这是JEE编程中不幸的一部分。有时需要重新启动,有时不需要。有没有办法解决这两个不同的类加载器问题?问题不在于两个不同的类加载器,而是BaseArStatus.class的两个不同副本。考虑BaseLoad实例来自何处。它可能来自一个web应用程序,它有自己定义的jar副本,甚至可能是jar的另一个版本。如果其他版本都不起作用,请在部署中查找.class文件的多个副本,包括WAR、EAR和jar。这会给你一个线索。因为现在问题已经解决了。我对10个不同的实体重复了同样的过程。在我处理完每一个实体之后,我部署了这场战争,大约有4个实体遇到了这个问题。我仍然需要对另外10个实体重复相同的过程,我非常确定我会再次得到该异常。我将检查WAR文件。部署后是否重新启动服务器?如果没有,那就是问题所在-服务器内存中有一个.class的热旧拷贝。这是JEE编程中不幸的一部分。有时需要重新启动,有时不需要。