Servlet Exception + Class Cast Exception + Glassfish + Netbeans + JPA Entities + Vaadin

时间:2009-12-05 19:49:17

标签: glassfish classcastexception vaadin servletexception

我收到此错误:

StandardWrapperValve [Vaadin Servlet]:PWC1406:servlet的Servlet.service()Vaadin Servlet抛出异常 java.lang.ClassCastException:com.delhi.entities.Category无法强制转换为com.delhi.entities.Category

当我尝试在glassfish v2上运行我的webapps时。

类别是JPA实体对象

根据服务器日志的违规代码是:

for (Category c : categories) {
          mymethod();
   }

类别来自:

List<Category> categories = q.getResultList();

知道出了什么问题吗?

5 个答案:

答案 0 :(得分:2)

这是一个类加载器问题。如果一个类由不同的类加载器加载,则它的对象不能相互分配。您可能已经将一个对象从一个WAR传递到另一个WAR。有几种方法可以解决这个问题:

  • 将所有代码放入一个WAR中。
  • 在WAR之间使用某种形式的远程处理。序列化处理类加载器问题。
  • 尝试将所有WAR放入单个EAR中。如果这不起作用,请将所有代码放入MANIFEST.MF中EAR的Classpath上的JAR。

答案 1 :(得分:1)

我曾经遇到过同样的问题和环境:

  • 我有Glassfish v4
  • Netbeans有以下项目
    • 包含实体的网页战争项目
    • 和耳朵项目与该网页战争项目

问题是在战争的项目设置中我检查了[x] 运行&gt;部署保存。这是导致部署战争项目每次我点击保存。它有时导致PermGen(内存)问题并且无法正确部署EAR(例如,在取消部署和部署EAR之间 - 这个&#34;疯狂&#34; Netbeans正在部署这场战争)。

解决方案:如果Netbeans&amp;&amp;使用EAR,然后在项目属性中保存时取消选中部署。

编辑:

似乎此错误与

有关
SEVERE:   The web application [/faces] created a ThreadLocal with key of type [org.glassfish.pfl.dynamic.codegen.impl.CurrentClassLoader$1] (value [org.glassfish.pfl.dynamic.codegen.impl.CurrentClassLoader$1@249ea63a]) and a value of type [org.glassfish.web.loader.WebappClassLoader] (value [WebappClassLoader (delegate=true; repositories=WEB-INF/classes/)]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.

答案 2 :(得分:1)

我今天遇到了同样的问题。解决方案是在使用后关闭EntityManagerFactory。
这个答案帮助我: https://stackoverflow.com/a/13823219/2455506

答案 3 :(得分:0)

我的观察是,只有在使用热重新部署或静态重新部署时才会发生这种情况。当然,这只适用于如果你得到一个类转换异常,其中to和from类都是相同的。

解决方法:

  • 不要使用undeploy和deploy而不是重新部署
  • 重新启动应用服务器
  • 删除受影响类的静态成员
  • 使用远程接口(序列化使其消失)

IMO我认为类加载器无法重新加载类,旧版本被重用,导致错误。


This article没有直接讨论这个错误,但它是关于类加载器如何工作的好背景信息。

答案 4 :(得分:0)

我也遇到过Glassfish v2和Glassfish v3这个问题。

我可以问你一个问题:你是否在部署应用程序时尝试初始化任何持久性对象(通过启动时加载的servlet或上下文监听器)?

bguiz一样,我注意到此问题仅在重新部署时发生。对新重启的Glassfish服务器的新部署从未出现过此问题。

就像FelixM提到的那样,我确信这是一个类加载器问题,但我不相信它是多个战争的问题(我只有1个部署到我的服务器)。在Glassfish 3中,我可以看到我的WAR正在使用2个Glassfish“引擎”。一个用于网络(战争),一个用于jpa。据我所知,这些是不同的容器,每个容器都有自己的类加载器。我猜测Glassfish v2以同样的方式工作。

我正在使用Spring并且(重新)在(重新)部署上初始化一些持久性对象。我在想的是,当Web引擎重新初始化战争时,jpa引擎仍在使用旧的类定义。通常,如果我在初始失败后重试重新部署,它可能会成功(有时可能需要多次重试,但最终我可以在没有重启的情况下取得成功 - 使用Glassfish v3比v2更好)。

此时我认为这两个类加载器不同步或者在重新部署时存在某种竞争条件,允许此操作有时成功。我试图强制类加载器,编写像这样的代码

HashMap<Object, Object> properties = new HashMap<Object, Object>();
properties.put(PersistenceUnitProperties.CLASSLOADER, this.getClass().getClassLoader());
entityManagerFactory = Persistence.createEntityManagerFactory(jpaContext, properties);

但它似乎没有任何影响。

我也想知道在启动时消除初始化是否可以解决问题,让appserver有时间在使用任何jpa类之前重新同步两个引擎(这就是为什么我问我的后续问题)。