GWT + GAE数据存储区密钥和文本Java错误

时间:2011-08-29 07:30:00

标签: java string google-app-engine gwt google-cloud-datastore

我想创建一个将记录保存并检索到GAE服务器的应用程序。我按照“部署到Google App Engine”教程http://code.google.com/webtoolkit/doc/latest/tutorial/appengine.html开始使用。

我现在正在使用StockWatcher应用程序,但在我的应用程序中,我需要存储一个可以很大(> 10KB)的字符串。我读到我不能使用Java String类型来存储大字符串,而是需要使用Text数据类型。

我认为通过Text,它们意味着:com.google.appengine.api.datastore.Text,但确认这是正确的会很好。 ???

无论如何,我无法让Text工作。经过一些研究后,似乎Key和Text两种类型只能用于服务器代码而不能用于客户端代码。看来这是因为源代码不适用于这些类,GWT需要源代码才能在客户端的计算机上创建JavaScript代码。至少我当前的工作假设是为什么我得到以下错误:

21:52:52.823 [ERROR] [myapp] Line 15: The import com.google.appengine.api.datastore cannot be resolved
21:52:52.951 [ERROR] [myapp] Line 103: Key cannot be resolved to a type
21:52:53.011 [ERROR] [myapp] Line 106: Text cannot be resolved to a type

我在共享文件夹的类中使用以下字段。

共享/ MyDataRecord

@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key id;

@Persistent
private Text description;

MyDataRecord类位于共享文件夹中,因为我想用一个get方法返回所有字段,而不是多个单独的字段get方法。以下是我在server / DataServiceImpl.java类中使用MyDataRecord类的方法

public class DataServiceImpl extends RemoteServiceServlet implements DataService
{
...
  @Override
  public MyDataRecord getDataRecord() throws NotLoggedInException
  {
    ...

我看到一些发布的解决方案建议使用非标准的第三方库,例如http://www.resmarksystems.com/code/。我无法安装这个,但即使我可以,我更喜欢不同的解决方案。存储文本必须是一项常见的任务,我宁愿使用被认为是标准解决方案来解决这个问题。

我可以更改我的代码以返回多个get方法中的每个字段,而不是单个返回MyDataRecord实例。但是,即使这样可行,这将是更多的工作,并且随着时间的推移更难以维护。但是,如果这是通常预期的,那就是我要做的。

我想用GWT和GAE的最佳实践来解决这个问题。一个简单的示例或教程将有很长的路要走,但我找不到一个。

是否有示例程序/教程显示GWT认为存储和检索大字符串的最佳做法?

我是GWT和GAE(以及网站开发)的新手,请在任何回复中考虑这一点,谢谢。

没有Snark请

2 个答案:

答案 0 :(得分:2)

可序列化的POJO。请注意描述的NotPersistent注释

package com.my.project.shared;

@PersistenceCapable(identityType=IdentityType.APPLICATION,detachable="true")
public class MyParent implements Serializable {

    @PrimaryKey
    @Persistent(valueStrategy=IdGeneratorStrategy.IDENTITY)
    private Long id;
    @NotPersistent //Note the NotPersistent annotation. GAE won't persist this value in big table
    private String description;

}

第二个POJO。请注意包

package com.my.project.server;

@PersistenceCapable(identityType=IdentityType.APPLICATION,detachable="true")
public class MyChild implements Serializable{//Not really required to implement Serializable

    @PrimaryKey
    @Persistent(valueStrategy=IdGeneratorStrategy.IDENTITY)
    private Long id;
    @Persistent
    private Long parentID;//Reference to the MyParent
    @Persistent
    private Text description;//The actual value of the description variable.
}

注意孩子中映射的父ID。在检索时,您需要确定哪个孩子属于哪个父母。 在伪代码中 1)从DB加载父级 2)识别该父级的子级,并加载它 3)转换child.description-> parent.description 4)现在你有一个完全构造的父POJO,它是可序列化的。将其发送到用户界面

只需在从UI返回GAE的过程中撤消该过程。

答案 1 :(得分:1)

1)在可序列化的POJO私有字符串描述中定义NotPersistent字段 2)在服务器端上定义一个新的POJO,它将具有私有文本描述 3)当您持久保存/加载原始POJO时,检索新的POJO并从文本描述中填充字符串描述