2013-03-15 65 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") 

不知道但如果这意味着你可以做什么,你本来没有,但它是值得一试,因为我不认为我的解决方案是“漂亮”的。

相关问题