Вопрос по – Отправка сохраненных экземпляров JDO через GWT-RPC

21

Я только начал изучать Google Web Toolkit и закончил написание учебного приложения Stock Watcher.

Правильно ли мое мышление, чтоif one wants to persist a business object (как сток)using JDO and send it туда и обратно к клиентуover RPC then one has to create two separate classes for that object: Один с аннотациями JDO для его сохранения на сервере, а другой - сериализуемый и используемый через RPC?

Я заметил, что у Stock Watcher есть отдельные классы, и я могу предположить, почему:

  • Otherwise the gwt compiler would try to generate javascript for everything the persisted class referenced like JDO and com.google.blah.users.User, etc
  • Also there may be logic on the server-side class which doesn't apply to the client and vice-versa.

Я просто хочу убедиться, что я правильно понимаю. Я не хочу создавать две версии всех моих классов бизнес-объектов, которые я хочу использовать поверх RPCif I don't have to.

Ваш Ответ

6   ответов
2

но для листинга сделайте это следующим образом:

List<YourCustomObject> secureList=(List<YourCustomObject>)pm.newQuery(query).execute();
return new ArrayList<YourCustomObject>(secureList);

Проблема не в сериализации объекта ... проблема в том, чтобы сериализировать класс Collection, который реализован в Google и не разрешен для сериализации.

0

на самом деле вам лучше этого не делать. В любом случае ваши объекты JDO должны быть простыми POJO и никогда не должны содержать бизнес-логику. Это для вашего бизнес-уровня, а не для ваших постоянных объектов.

Все, что вам нужно сделать, это включить источник аннотаций, которые вы используете, и GWT должен скомпилировать ваш класс просто отлично. Кроме того, вы хотите избежать использования библиотек, которые GWT не может компилировать (например, вещи, которые используют отражение и т. Д.), Но во всех проектах, которые я делал, это никогда не было проблемой.

Error: User Rate Limit Exceeded
0

что лучший формат для отправки объектов через GWT - через JSON. В этом случае с сервера будет отправлена строка JSON, которая затем должна быть проанализирована в клиенте. Преимущество заключается в том, что конечный Javascript, который отображается в браузере, имеет меньший размер. таким образом заставляя страницу загружаться быстрее.

Во-вторых, для отправки объектов через GWT объекты должны быть сериализуемыми. Это может быть не для всех объектов

В-третьих, GWT имеет встроенные функции для обработки JSON ... так что никаких проблем на стороне клиента

Error: User Rate Limit Exceeded
2

Ваша оценка верна. JDO заменяет экземпляры коллекций их собственными реализациями, чтобы, я полагаю, анализировать при изменении графа объектов. Эти реализации не известны компилятору GWT, поэтому он не сможет их сериализовать. Это часто случается с классами, состоящими из GWT-совместимых типов, но с аннотациями JDO, особенно если некоторые свойства объекта являются коллекциями.

Для подробного объяснения и обходного пути, проверьте это довольно влиятельное эссе на тему:http://timepedia.blogspot.com/2009/04/google-appengine-and-gwt-now-marriage.html

Error: User Rate Limit Exceeded
4

you don't need to create duplicate classes.

Я рекомендую вам взглянуть на следующее обсуждение групп Google в списке gwt-contributors:

http://groups.google.com/group/google-web-toolkit-contributors/browse_thread/thread/3c768d8d33bfb1dc/5a38aa812c0ac52b

Вот интересный отрывок:

If this is all you're interested in, I described a way to make GAE and GWT-RPC work together "out of the box". Just declare your entities as: @PersistenceCapable(identityType = IdentityType.APPLICATION, detachable = "false") public class MyPojo implements Serializable { }

and everything will work, but you'll have to manually deal with re-attachment when sending objects from the client back to the server.

Вы можете использовать эту опцию, и вам не понадобится класс зеркала (DTO). Вы также можете попробоватьГалаадском (бывший hibernate4gwt), который заботится о некоторых деталях в рамках проблем сериализации улучшенных объектов.

1

Вот два совета:

Используйте ключ в кодировке String, а не класс Appengine Key.

pojo = pm.detachCopy(pojo)

... удалит все улучшения JDO.

Похожие вопросы