Отправка сохраненных экземпляров JDO через GWT-RPC - PullRequest
21 голосов
/ 29 июня 2009

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

Правильно ли мое мышление, что , если кто-то хочет сохранить бизнес-объект (например, Stock) с помощью JDO и отправить его туда и обратно клиенту через RPC, тогда нужно создать два отдельных класса для этого объекта : один с аннотациями JDO для его сохранения на сервере, а другой - для сериализации и использования через RPC?

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

  • В противном случае компилятор gwt попытается генерировать JavaScript для всего постоянный класс, на который ссылаются как JDO и com.google.blah.users.User и т. Д.
  • Также может быть логика на стороне сервера класс, который не относится к клиенту и наоборот.

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

Ответы [ 6 ]

4 голосов
/ 29 сентября 2009

Краткий ответ: вам не нужно создавать повторяющиеся классы .

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

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

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

Если это все, что вас интересует, я описал способ сделать GAE и GWT-RPC работают вместе "из коробка ". Просто объявите ваши объекты как: @PersistenceCapable (identityType = IdentityType.APPLICATION, съемный = "false") открытый класс MyPojo реализует Serializable {}

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

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

2 голосов
/ 28 января 2011

Я наконец нашел решение. Не меняйте свой объект вообще, но для листинга сделайте это так:

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

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

2 голосов
/ 30 июня 2009

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

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

1 голос
/ 07 мая 2010

Вам не нужно создавать две версии модели домена.

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

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

pojo = pm.detachCopy(pojo)

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

0 голосов
/ 25 января 2013

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

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

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

0 голосов
/ 30 июня 2009

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

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

...