【问题标题】:Fetching data from jdo datastore从 jdo 数据存储中获取数据
【发布时间】:2013-03-04 12:58:00
【问题描述】:

我在客户端创建了两个类,它们使用 GWT 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:类型 'org.datanucleus.store.types.sco.backed.ArrayList' 未包含在可由此 SerializationPolicy 或其类对象序列化的类型集中不被加载。出于安全考虑,此类型不会被序列化。

我不知道出了什么问题。欢迎提出任何建议。

【问题讨论】:

    标签: java gwt serialization jdo


    【解决方案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 更改为仅 List(不确定是否有必要)并使用 detachCopyAll 复制列表,使其不再连接到数据存储区,这是为我消除错误的魔力。

    有一个注解可以使用,我引用自documentation

    您可以在 PersistenceManager 关闭后修改对象 通过将类声明为“可拆卸”。为此,请添加可拆卸 @PersistenceCapable 注解的属性:

    @PersistenceCapable(detachable="true")
    

    不确定这是否意味着你可以做你最初做的事情,但值得一试,因为我认为我的解决方案并不“漂亮”。

    【讨论】:

      【解决方案2】:

      ArrayList 声明更改为使用Java 的ArrayList

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

      GWT 无法序列化没有默认构造函数的对象,并且您导入的ArrayList (org.datanucleus.store.types.sco.backed.ArrayList) 没有提供默认构造函数,导致序列化失败.

      您可能错误地导入了这个类,在这种情况下您可以更改导入声明。但是,如果您在其他地方使用它,则必须使用完整的限定符,如图所示。

      【讨论】:

        猜你喜欢
        • 2014-10-19
        • 1970-01-01
        • 1970-01-01
        • 2013-09-22
        • 2014-02-28
        • 2021-04-15
        • 2016-02-08
        • 2016-04-04
        • 2023-03-20
        相关资源
        最近更新 更多