ArrayList выдает исключение при извлечении из хранилища данных Google (с gwt, java) - PullRequest
3 голосов
/ 22 апреля 2010

Я использую Google Web Toolkit с java и хранилищем данных Google в качестве базы данных.У класса сущности есть arraylist, и при попытке извлечь данные из базы данных я получаю исключение:

Тип 'org.datanucleus.sco.backed.ArrayList' не был включен в набортипы, которые могут быть сериализованы этим SerializationPolicy или его объектом Class, не могут быть загружены.В целях безопасности этот тип не будет сериализован.

Я использую JPA.

Код объекта:

 package com.ver2.DY.client;

 import java.io.Serializable;
 import java.util.ArrayList;

 import javax.jdo.annotations.IdGeneratorStrategy;
 import javax.jdo.annotations.PersistenceCapable;
 import javax.jdo.annotations.Persistent;
 import javax.jdo.annotations.PrimaryKey;

 import com.google.gwt.user.client.rpc.IsSerializable;

 @PersistenceCapable
 public class ChatInfo implements Serializable, IsSerializable{
  @PrimaryKey
  @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
  private Long topicId;

  @Persistent
  private String chatTopic;

  @Persistent
  private ArrayList<String> messages = new ArrayList<String>();

  @Persistent
  private boolean isFirstPost;

  public ChatInfo()
  {

  }


  public Long getTopicId() {    
   return topicId;
  }
  public void setTopicId(Long topicId) {
   this.topicId = topicId;
  }
  public String getChatTopic() {
   return chatTopic;
  }
  public void setChatTopic(String chatTopic) {
   this.chatTopic = chatTopic;
  }
  public ArrayList<String> getMessages() {
   return messages;
  }
  public void addMessage(String newMsg) {
    messages.add(newMsg);
  }

  public boolean isFirstPost() {
   return isFirstPost;
  }
  public void setFirstPost(boolean isFirstPost) {
   this.isFirstPost = isFirstPost;
  }

 }

Метод в классе БД:

@Transactional
  public ChatInfo[] getAllChat() {
   PersistenceManager pm = PMF.get().getPersistenceManager();
   List<ChatInfo> chats = null;
   ChatInfo[] infos = null;
   String query = "select from " + ChatInfo.class.getName();
   try{
    chats = (List<ChatInfo>) pm.newQuery(query).execute();


   infos = new ChatInfo[chats.size()];
   for(int i=0;i<chats.size();i++)
   {
    infos[i] = new ChatInfo();
    infos[i] = (ChatInfo) chats.get(i);
   }
   }
   finally{
    pm.close();
   }
   return infos;

  }

Это немного странно, потому что раньше я мог вставлять и извлекать данные, но теперь выбрасывал исключение.При поиске в Интернете я обнаружил, что мне нужно преобразовать Arraylist из некоторого типа DataNucleus в утилиту java, но я не уверен, как это сделать.

Ответы [ 2 ]

2 голосов
/ 18 августа 2010

Исключение вызвано тем фактом, что класс отсутствует в вашем белом списке GWT RPC (список классов, которые можно сериализировать).

Я не вижу ни одного импорта org.datanucleas.sco.backed.ArrayList ни в одном из приведенных вами примеров кода.

Проверьте этот вопрос для получения дополнительной информации о GWT и JPA.

1 голос
/ 14 июня 2011

Эта проблема описана здесь и пара из ошибок была открыта на нем. По сути, при получении из хранилища данных вы не получаете обратно java.util.ArrayList, вместо этого вы получаете org.datanucleus.sco.backed.ArrayList. Все выглядит нормально, пока вы не вызовете RPC, когда, что неудивительно, он не сможет сериализовать этот тип.

Похоже, что хакерское исправление преобразовывает ArrayList в правильный тип после извлечения объекта, но перед вызовом любых RPC, которые его используют. По крайней мере, пока ошибки не будут устранены.

...