4

我收到此错误:

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

当我尝试在 glassfish v2 上运行我的网络应用程序时。

类别是 JPA 实体对象

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

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

类别来源于:

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

知道出了什么问题吗?

4

5 回答 5

2

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

  • 将所有代码放入一个 WAR 中。
  • 在 WAR 之间使用某种形式的远程处理。序列化处理类加载器问题。
  • 尝试将所有 WAR 放入一个 EAR。如果这不起作用,请将所有代码放入 MANIFEST.MF 中 EAR 类路径上的 JAR 中。
于 2009-12-05T20:00:18.343 回答
1

我曾经遇到过同样的问题,并且我的环境如下:

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

问题是在战争的项目设置中,我检查了 [x] Run>Deploy on save。这导致每次我点击 save 时都部署战争项目。它有时会导致 PermGen(内存)问题和无法正确部署 EAR(因为例如在取消部署和部署 EAR 之间——这个“疯狂”的 Netbeans 正在部署这场战争)。

解决方案:如果 Netbeans && 使用 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.
于 2014-05-06T19:00:37.383 回答
1

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

于 2015-03-23T12:44:45.900 回答
0

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

解决方法:

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

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


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

于 2010-06-01T12:41:44.007 回答
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);

但它似乎没有任何影响。

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

于 2010-07-02T13:54:29.327 回答