0

GWT + Spring + Hibernate を使用しようとしています。アプリケーションを起動すると、次のエラーが発生します。

com.google.gwt.user.client.rpc.SerializationException: タイプ 'org.hibernate.collection.PersistentBag' は、この SerializationPolicy によってシリアル化できるタイプのセットに含まれていないか、そのクラス オブジェクトをロードできませんでした。セキュリティ上の理由から、この型はシリアル化されません。: インスタンス = [com.asso.shared.model.Activite@64d6357a]

永続性クラスのリストでこのメソッドを使用した後:

public static <T> ArrayList<T> makeGWTSafe(List<T> list) {
        if(list instanceof ArrayList) {
            return (ArrayList<T>)list;
        } else {
            ArrayList<T> newList = new ArrayList<T>();
            newList.addAll(list);
            return newList;
        }
    }

私のリストで私はこれを得ました:

com.google.gwt.user.client.rpc.SerializationException: タイプ 'org.hibernate.collection.PersistentBag' は、この SerializationPolicy によってシリアル化できるタイプのセットに含まれていないか、そのクラス オブジェクトをロードできませんでした。セキュリティ上の理由から、この型はシリアル化されません。: インスタンス = [com.asso.shared.model.Personne@75a2fb58]

==========================================

他の件名を検索しましたが、解決策が見つかりません! この連載の件、どうやって解決するの!? Persistence クラスで List を使用しています

4

1 に答える 1

2

DTO オブジェクトをクライアント側に送信する必要があります (Hibernate に基づく元のオブジェクトではなく)。問題は、Personne オブジェクトが実際には Hibernate プロキシであることです。その上で何らかのメソッドを呼び出すたびに、Hibernate はいくつかの作業を行います (たとえば、DB からコレクションをフェッチします)。このような種類のオブジェクトをシリアル化する簡単な方法はありません。

休止状態のエンティティ:

//Hibernate entity
public class Personne {

    private String name;
    private List<Address> addresses;
}

//Hibernate entity
public class Address {


}

対応する DTO オブジェクト:

public class PersonneDto {

    private String name;
    private List<AddressDto> addresses;
}

public class AddressDto {


}

Personne をクライアント側に送信する代わりに、新しい PersonneDto オブジェクトを作成し、状態をそれにコピーしてから UI に送信する必要があります。Personneほとんどの場合、データをフェッチするために DB をヒットするため、クライアント側では使用できませんPersonne.getAddresses()(これはクライアント側の JS では実行できません)。したがって、それぞれをクライアント側Personneで置き換える必要があります。PersonneDto欠点として、エンティティを DTO に変換するために、DTO オブジェクトと対応するコードの追加レイヤーを管理する必要があります。この問題には別のアプローチがあります。詳細については、この記事を参照してください。

于 2013-05-28T15:13:44.173 に答える