GWT:SerializationException

时间:2013-05-28 15:06:17

标签: spring hibernate gwt

我正在尝试使用GWT + Spring + Hibernate 在浏览应用程序时,我收到此错误:

com.google.gwt.user.client.rpc.SerializationException:类型'org.hibernate.collection.PersistentBag'未包含在可由此SerializationPolicy序列化的类型集中,或者无法加载其Class对象。出于安全考虑,此类型不会被序列化:instance = [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序列化的类型集中,或者无法加载其Class对象。出于安全考虑,此类型不会被序列化:instance = [com.asso.shared.model.Personne@75a2fb58]

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

我搜索了其他科目,但我找不到任何解决方案! 我该怎么解决这个序列化的事情!? 我在我的持久化课程中使用List

1 个答案:

答案 0 :(得分:2)

您需要将DTO对象发送到客户端(而不是Hibernate支持的原始对象)。问题是你的Personne对象实际上是一个Hibernate代理。每当你调用一些方法时,Hibernate就会做一些工作(例如从DB中获取集合)。没有简单的方法来序列化这类对象。

Hibernate实体:

//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 {


}

您需要创建新的PersonneDto对象,将状态复制到该对象,然后发送到UI,而不是将Personne发送到客户端。 Personne不能在客户端使用,因为Personne.getAddresses()在大多数情况下命中DB来获取数据(这在客户端JS中是不可能的)。因此,每个Personne必须在客户端由PersonneDto替换。作为一个缺点,您需要提供额外的DTO对象和相应的代码以将实体转换为DTO。还有另一种解决这个问题的方法。有关详细信息,请参阅this article