2013-03-15 3 views
0

Я создал два класса на стороне клиента, и они хранятся с использованием GWT JDO.
Родительский класс выглядит следующим образом:Получение данных из jdo datastore

@PersistenceCapable(identityType = IdentityType.APPLICATION) 
public class Park implements Serializable{ 

    @PrimaryKey 
    @Persistent 
    private String parkId; 

    //... 
    @Persistent(mappedBy = "park", defaultFetchGroup = "true") 
    private List<Facility> facilityList; 

    // other stuff 

и ребенок выглядит следующим образом:

@PersistenceCapable(identityType = IdentityType.APPLICATION) 
public class Facility implements Serializable{ 

    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    @Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true") 
    private String encodedKey; 

    @Persistent 
    private Park park; 

    // other stuff 

А на стороне сервера, у меня есть метод для извлечения все:

public Park[] getParks(){ 
    PersistentManager pm = getPersistentManager(); 
    ArrayList<Park> parkList = new ArrayList<Park>(); 
    try { 
     Query q = pm.newQuery(Park.class); 
     List<Park> parks = (List<Park>) q.execute(); 
     for(Park p:parks) 
      parkList.add(p); 
    } finally { 
     pm.close(); 
    } 
    return parkList.toArray(new Park[parkList.size()]); 
} 

Когда я вызовите этот метод, он выдает исключение:
com.google.gwt.user.client.rpc.SerializationException: Введите 'org.datanucleus.store.t ypes.sco.backed.ArrayList 'не был включен в набор типов, которые могут быть сериализованы с помощью этого объекта SerializationPolicy или его класса не могут быть загружены. В целях безопасности этот тип не будет сериализован.

Не могу понять, в чем дело. Любое предложение приветствуется.

ответ

0

Изменение ArrayList декларации использовать в Java ArrayList:

java.util.ArrayList<Park> parkList = new java.util.ArrayList<Park>(); 

GWT не может сериализовать объекты, которые не имеют конструктор по умолчанию, а также ArrayList вы импортировали (org.datanucleus.store.types.sco.backed. ArrayList) не предоставляет конструктор по умолчанию, что приводит к сбою сериализации.

Возможно, что вы импортировали этот класс по ошибке, и в этом случае вы можете просто изменить объявление импорта. Но если вы используете его где-то в другом месте, вам придется использовать полный квалификатор, как показано.

1

У меня была эта проблема некоторое время назад, и это было довольно неприятно. И я также уверен, что ваша проблема не в том, что вы импортировали неправильный пакет. Вы, наверное, уже решили это, но если кто-то еще должен решить проблему.

Попробуйте ниже пример кода:

public Park[] getParks(){ 
    PersistentManager pm = getPersistentManager(); 
    List<Park> parkList = null; 
    try { 
     Query q = pm.newQuery(Park.class); 
     parkList = (List<Park>) q.execute(); 
     parkList = pm.detachCopyAll(parkList); 
    } finally { 
     pm.close(); 
    } 
    return parkList.toArray(new Park[parkList.size()]); 
} 

В приведенном выше примере я изменил ArrayList просто список (не уверен, если это необходимо) и использовать detachCopyAll, чтобы скопировать список, чтобы он не подключен к хранилищу данных более того, это волшебство, которое устранило ошибку для меня.

Там в аннотации, которые могут быть использованы, я цитирую из documentation:

Вы можете изменить объект после PersistenceManager был закрыт , объявив класс как «съемный». Чтобы сделать это, добавьте съемный атрибут к @PersistenceCapable аннотации:

@PersistenceCapable(detachable="true") 

Не уверен, хотя, если это означает, что вы можете сделать, что вы изначально делали, но это стоит попробовать, потому что я не думаю, мое решение «красиво».