2013-03-15 68 views
0

我在客戶端創建了兩個類,它們使用GWT JDO存儲。
父類的樣子:從jdo數據存儲中獲取數據

@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:Type'org.datanucleus.store.t ypes.sco.backed.ArrayList'未包含在可由此SerializationPolicy序列化的類型集合中,或者其Class對象無法加載。爲了安全起見,這種類型不會被序列化。

我無法弄清楚什麼是錯的。任何建議都是值得歡迎的。

回答

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") 

不知道但如果這意味着你可以做什麼,你本來沒有,但它是值得一試,因爲我不認爲我的解決方案是「漂亮」的。

相關問題