2013-05-28 5 views
0

Я пытаюсь использовать GWT + Spring + Hibernate Когда lunshing приложения я получаю эту ошибку:GWT: SerializationException

com.google.gwt.user.client.rpc.SerializationException: Тип «org.hibernate .collection.PersistentBag 'не был включен в набор типов, которые могут быть сериализованы с помощью этого объекта SerializationPolicy или его объекта класса, не могут быть загружены. В целях безопасности, этот тип не будет сериализовать .: экземпляр = [[email protected]]

после использования этого метода со списками классов настойчивости:

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' не был включен в набор типов, которые могут быть сериализованы этой сериализациейPolicy или его объект класса нельзя загрузить. В целях безопасности этот тип не будет сериализован .: instance = [[email protected]]

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

Я искал в других предметах, но я не могу найти решение! Как я могу решить эту сериализацию ?? Я использую List в моих классах Persistence

ответ

2

Вам нужно отправить объект DTO на клиентскую сторону (вместо оригинальной, поддерживаемой Hibernate). Проблема в том, что ваш объект Personne фактически является прокси-сервером Hibernate. Каждый раз, когда вы вызываете какой-либо метод на нем, Hibernate выполняет некоторую работу (например, выборку из базы данных). Нет простого способа сериализации таких объектов.

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 { 


} 

Вместо отправки Personne на стороне клиента, вам нужно создать новый объект PersonneDto, скопировать состояние на него, а затем отправить UI. Personne не может использоваться на стороне клиента, потому что Personne.getAddresses() в большинстве случаев удаляет БД для извлечения данных (что невозможно сделать на стороне клиента JS). Таким образом, каждый Personne должен быть заменен на PersonneDto на стороне клиента. В качестве недостатка вам нужно уделить дополнительную дополнительную информацию объектам DTO и соответствующему коду для преобразования объектов в DTO. Существуют и другие подходы к решению этой проблемы. См. this article для более подробной информации.

+0

Пожалуйста, мне нужно очень четкое объяснение и возможный пример, если это возможно! Если вы можете это сделать, вы должны знать, что вы спасли меня, незнакомец где-то на земном шаре. –

+0

PS: добавлено (Personne p), но когда дело доходит до get() У меня есть эта ошибка сериализации –

+0

Я не понимал, как и где использовать класс DTO! На стороне сервера я управляю классом Personne, и у меня есть отношения ManyToMany с другими классами! Как использовать DTO здесь –

Смежные вопросы