0

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 を実装していることです。これを解決するにはどうすればよいですか?

ありがとう !

---- 追加情報 2012 年 7 月 20 日 ----

セッション 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;
}
4

2 に答える 2

1

クラスをシリアライズ可能にすることは、その中のすべてがシリアライズ可能になることを意味するわけではありません。クラス内のすべての参照(依存関係/プロパティ)、それら自体はシリアル化可能であり、次にそれらの参照である必要があります。

上記の例外により、セッション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;
    }

お役に立てれば !!!!

于 2012-07-19T05:24:06.167 に答える