我正在使用 EclipseLink (JPA 2.0) 在 netbeans 中运行 JSF + Primefaces + tomcat 6.0.32 的环境。
我的应用程序工作正常,但每次运行它时,我都会收到很多警告,指出无法序列化我的会话 bean,并为每个会话 bean 显示这样的块:
18-jul-2012 23:05:46 org.apache.catalina.session.StandardSession writeObject
ADVERTENCIA: No puedo serializar atributo de sesión facturacionController para sesión 62A53325838E1E7C6EB6607B1E7965E6
java.io.NotSerializableException: org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
... and so on...
问题是我的会话 bean 已经实现了可序列化。
那么我能做些什么来解决这个问题呢?
Thanks !
---- 添加信息 07/20/2012 ----
我从会话 bean 引用 EntityManager 的唯一一点是当我在 getter 属性中创建 jpaController 时,如下所示:
private JpaController getJpaController() {
if (jpaController == null) {
jpaController = new JpaController(Persistence.createEntityManagerFactory("myPersistenceUnit"));
}
return jpaControllerPedido;
}
那是因为我像这样定义了 jpaController 构造函数:
public JpaController(EntityManagerFactory emf) {
this.emf = emf;
}
使类可序列化并不意味着其中的所有内容都将是可序列化的。类中的所有引用(依赖项/属性),它们本身应该是可序列化的,反过来它们的引用也应该是可序列化的。
根据上面的异常,您的会话 bean 似乎引用了不可序列化的 EntityManagerFactoryImpl 对象,因此出现错误。
为了解决这个问题,你可以将其定义为transient
它不会被序列化,但唯一的问题是在反序列化期间,您必须手动构建对象或分配引用。
我建议看看这篇文章序列化 http://www.ibm.com/developerworks/java/library/j-5things1/index.html.
如何解决这个问题,我不做 JPA,所以无法判断是否有相同的序列化类,
为了解决这个问题,将参考定义为transient
transient EntityManagerFactory entityManagerFactory
并在反序列化钩子方法中手动将引用分配回bean,如下所述。
private void readObject(java.io.ObjectInputStream stream)
throws java.io.IOException, ClassNotFoundException
{
stream.defaultReadObject();
// assign reference manually.
this.entityManagerFactory = //get from factory;
}
希望这可以帮助 !!!!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)