GWT&x2B;GAE数据存储密钥和文本Java错误

GWT&x2B;GAE数据存储密钥和文本Java错误,java,string,google-app-engine,gwt,google-cloud-datastore,Java,String,Google App Engine,Gwt,Google Cloud Datastore,我想创建一个将记录保存和检索到GAE服务器的应用程序。我按照教程“部署到谷歌应用程序引擎”开始学习 我现在有StockWatcher应用程序在工作,但在我的应用程序中,我需要存储一个大的字符串(>10KB)。我读到我不能使用Java字符串类型来存储大字符串,而需要使用文本数据类型 我认为文本的意思是:com.google.appengine.api.datastore.Text,但最好能确认这是正确的 不管怎样,我无法让文本正常工作。经过一些研究,似乎密钥和文本类型只能在服务器代码中使用,而不能

我想创建一个将记录保存和检索到GAE服务器的应用程序。我按照教程“部署到谷歌应用程序引擎”开始学习

我现在有StockWatcher应用程序在工作,但在我的应用程序中,我需要存储一个大的字符串(>10KB)。我读到我不能使用Java字符串类型来存储大字符串,而需要使用文本数据类型

我认为文本的意思是:com.google.appengine.api.datastore.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方法返回的所有字段,而不是多个单独的field get方法。下面是我如何在server/dataserviceinpl.java类中使用MyDataRecord类

public class DataServiceImpl extends RemoteServiceServlet implements DataService
{
...
  @Override
  public MyDataRecord getDataRecord() throws NotLoggedInException
  {
    ...
我看到一些发布的解决方案建议使用非标准的第三方库,如。我无法安装这个,但即使可以,我还是希望使用不同的解决方案。存储文本必须是一项非常常见的任务,因此我更愿意使用标准解决方案来解决这个问题

我可以更改代码,以在多个get方法中返回每个字段,而不是只返回一个MyDataRecord实例。然而,即使这样做有效,随着时间的推移,这将大大增加工作量,并且更难维护。然而,如果这是通常所期望的,那么这就是我要做的

我想使用GWT和GAE所认为的最佳实践来解决这个问题。一个简单的例子或教程会有很大帮助,但我找不到

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

我是GWT和GAE(以及Web开发)的新手,请在任何回复中考虑这一点,谢谢。p> 无障碍请

1)在可序列化的POJO私有字符串描述中定义一个NotPersistent字段 2) 在服务器端定义一个新的POJO,该POJO将具有私有文本描述
3) 在持久化/加载原始POJO时,检索新POJO并从可序列化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) 从数据库加载父级 2) 标识此父级的子级并加载它 3) 转换child.description->parent.description 4) 现在您有了一个完全构造的可序列化的父POJO。将其发送到UI


在从UI返回GAE的过程中,只需颠倒这个过程。

那么就创建两个类?一个实现java.io.Serializable接口的是POJO。另一个类具有@Persistent private Text description;并编写在所有字段之间来回转换的代码?维护两个类似乎需要很多工作,但如果这是预期的,那就是我要做的。谢谢,不用了。具有的第二个类只有一个ID,该ID映射到第一个类的UID和文本描述。无需拥有第一份POJO的完整副本。把文字抽象出来好吧,我不明白你在说什么。你能举出一个例子来说明你所说的吗?一个例子是回答这个问题最简单的方法。谢谢。这很清楚。在看了你的建议之后,我可能会看到两种可能的解决方案,这取决于我是否理解你的建议。两种解决方案都需要将类拆分为两个类,但方式不同。一种方法是,将只能在服务器上使用的所有数据成员(如文本和密钥)拆分为一个类。在另一个类中,放置可在客户端和服务器上共享的所有数据成员。另一种方法是通过复制每个类中的所有数据成员来拆分这些类。与第一种方法一样,使用Long来存储键,使用字符串来存储共享类中的文本。共享类将是一个POJO,因为它不会被持久化(没有@Persistent Data)。您需要能够在每个类之间进行转换。定义的客户机接口(DataService.java和dataservicecasync.java)将仅使用共享类。服务器的类(DataServiceImpl.java)实现在读取和写入数据库时将使用用户定义的转换。如果没有完整的示例,我可能会误解您所说的,所以我可能仍然不理解。因为我没有使用GAE的经验,所以可能还缺少其他考虑因素。而且,由于我还没有尝试过这两种解决方案,所以可能会出现一些我无法预见的问题。我认为2完整类解决方案会更好,因为它意味着每个类实例只在数据库中保存一条记录。