2009-12-05 84 views
3

我得到这个错误:servlet异常+类转换异常+ Glassfish的+ Netbeans的+ JPA实体+ Vaadin

StandardWrapperValve [Vaadin的Servlet]:PWC1406:Servlet.service()进行的servlet Vaadin的Servlet抛出异常 的java .lang.ClassCastException:com.delhi.entities.Category不能转换为com.delhi.entities.Category

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

类别是JPA实体对象

有问题的代码根据服务器日志:

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

任何想法出了什么问题:

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

类别源自?

回答

1

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

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

我的观察是,它只发生在使用热重新部署或静态重新部署时。当然,这只适用于在类和类都相同的情况下得到类转换异常。

解决方法:

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

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


This article不谈论这个错误直接,但它是在类加载器是如何工作的良好背景资料。

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类之前重新同步两个引擎(这就是为什么我问我的后续问题)。

0

我曾经有过同样的问题,我有环境是以下几点:

  • 我Glassfish的V4
  • NetBeans支持以下项目
    • 含网页战项目实体
    • 和耳朵项目与网页战争项目

问题是,在战争的项目设置中,我检查了[x] 运行>部署保存。这是导致部署战争项目我每次击中保存。有时会导致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 [[email protected]a63a]) 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.