Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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

pojo = pm.detachCopy(pojo)

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

Ответ 5

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

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

Ответ 6

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

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

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