无法序列化会话Bean - 警告抛出

时间:2012-07-19 03:00:45

标签: jsf jpa session-bean

我正在使用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已经实现了Serializable。 那么我该怎么做才能解决这个问题呢?

谢谢!

----添加信息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;
}

2 个答案:

答案 0 :(得分:1)

创建类Serializable并不意味着其中的所有内容都是可序列化的。您的类中的所有引用(依赖项/属性),它们本身应该是可序列化的,反过来它们的引用。

根据上述异常,您的会话bean似乎引用了EntityManagerFactoryImpl对象,该对象不可序列化,因此也是错误。

要解决此问题,您可以将其定义为transient,而不是将其序列化,但在反序列化过程中只会遇到问题,您必须手动构建对象或分配参考。

我建议您查看Serilization上的这篇文章。

如何解决这个问题,我不做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;
    }

希望这有助于!!!!

答案 1 :(得分:0)

您只需添加:

transient EntityManagerFactory entityManagerFactory;

但是如果有任何其他实现 entityManagerFactory 的对象,则该对象也必须定义为。例如

transient static final EntityManagerFactory emf = Persistence.createEntityManagerFactory("porpertiesConexion");
transient EntityManager em;    


public void beginTransaction() {           
    em = emf.createEntityManager();  //
        //code....
}