Ключ Java GWT + GAE и текстовая ошибка хранилища данных - PullRequest
1 голос
/ 29 августа 2011

Я хотел бы создать приложение, которое сохраняет и извлекает записи на сервер GAE.Я начал с учебника «Развертывание в Google App Engine» http://code.google.com/webtoolkit/doc/latest/tutorial/appengine.html.

У меня сейчас работает приложение StockWatcher, но в моем приложении мне нужно хранить строку, которая может быть большой (> 10KB).Я прочитал, что не могу использовать тип Java String для хранения больших строк, и вместо этого мне нужно использовать тип данных Text.

Я думаю, что под текстом они подразумевают: com.google.appengine.api.datastore.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

Я использую следующие поля в классе в общей папке.

shared / MyDataRecord

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

@Persistent
private Text description;

Класс MyDataRecord в общей папке, потому что я хотел использовать для отправки всех полей в одном возвращаемом методе get, а не нескольких отдельных полевых методов get.Вот как я использую класс MyDataRecord в своем классе server / DataServiceImpl.java

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 (а такжекак веб-разработка), пожалуйста, учтите это в любых ответах, спасибо.

Нет, Снарк, пожалуйста

Ответы [ 2 ]

2 голосов
/ 30 августа 2011

Сериализуемый 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.
}

Обратите внимание на родительский идентификатор, сопоставленный с дочерним. Во время поиска вам нужно будет определить, какой ребенок принадлежит к какому из родителей. В псевдокоде 1) Загрузить родителя из БД 2) Определите дочерний элемент для этого родителя и загрузите его 3) Конвертировать child.description-> parent.description 4) Теперь у вас есть полностью сконструированный родительский POJO, который можно сериализировать. Отправьте его в пользовательский интерфейс

Просто измените процедуру на обратном пути от интерфейса пользователя к GAE.

1 голос
/ 29 августа 2011

1) Определите поле NotPersistent в вашем сериализуемом описании приватной строки POJO 2) Определите новый POJO на стороне сервера , который будет иметь личное текстовое описание 3) Когда вы сохраните / загрузите исходный POJO, извлеките новый POJO и заполните описание String из текстового описания

...