2010-04-22 86 views
3

我使用谷歌Web工具包與Java和谷歌數據存儲作爲數據庫。 實體類有ArrayList和對正在嘗試從數據的基礎上,我發現了異常數據:ArrayList從谷歌數據存儲檢索異常(與GWT,Java)

類型「org.datanucleus.sco.backed.ArrayList」沒有被列入類型的集合 可以通過此SerializationPolicy對其進行序列化,或者可以使用其類對象 不加載。爲了安全起見,這種類型不會被序列化。

我正在使用JPA。

實體代碼:在DB類

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 util,但不知道如何做到這一點。

+1

有人可以編輯這個問題,並將代碼放入代碼構造嗎? – Syntax 2010-08-18 00:40:51

回答

2

該異常是由於該類不在您的GWT RPC白名單(可序列化的類的列表)中導致的。

我無法在任何示例代碼中看到org.datanucleas.sco.backed.ArrayList的任何導入。

有關GWT和JPA的更多信息,請查看this question

1

此問題描述爲here和一對ofbugs已被打開。從本質上講,當從數據存儲庫中檢索到時,您沒有收到java.util.ArrayList,而是獲得了org.datanucleus.sco.backed.ArrayList。一切似乎都很好,直到你調用RPC時,毫不奇怪,它無法序列化這種類型。

hacky修復程序似乎是在檢索對象之後但在調用使用它的任何RPC之前將ArrayList轉換爲正確的類型。至少在bug修復之前。