GWT вручную сериализует объект домена на сервере - PullRequest
5 голосов
/ 17 марта 2012

Первое, что делает мое приложение GWT при загрузке, это запрос текущего зарегистрированного пользователя с сервера через RequestFactory. Это блокирует, потому что мне нужны свойства пользователя, чтобы знать, как действовать. Это займет всего <500 мс, но меня действительно раздражает, что приложение заблокировано в это время. У меня уже есть Пользователь на сервере, когда генерируется jsp, так почему бы просто не добавить сериализованного Пользователя в jsp и полностью исключить этот запрос? </p>

У меня две проблемы, мешающие мне сделать это:

  • Мне нужно преобразовать User в UserProxy
  • Мне нужно сериализовать UserProxy таким образом, чтобы GWT было легко его десериализовать.

Я не нашел хороший способ сделать # 1. Эта логика, кажется, похоронена в ServiceLayerDecorator без простого способа изолировать? Я могу ошибаться здесь.

Второй кажется проще с помощью ProxySerializer Но как мне достать фабрику запросов, когда я на сервере? Вы не можете позвонить GWT.create на сервере.

Я искал AutoBeans , но это не относится к № 1 выше. В моем UserProxy есть ссылки на коллекции других EntityProxy, которые я бы хотел сохранить.

Ответы [ 4 ]

5 голосов
/ 29 марта 2012

Возможно использование AutoBeans, если вы создаете AutoBeanFactory для своих прокси:

  • Чтобы преобразовать пользователя в UserProxy: Создайте на стороне сервера RequestFactory и вызовите тот же обычный запрос. Ответ будет содержать UserProxy (но на сервере).

  • Для сериализации UserProxy:

    AutoBean<UserProxy> bean = AutoBeanUtils.getAutoBean(receivedUserProxy);

    String json = AutoBeanCodex.encode(bean).getPayload();

  • Для десериализации UserProxy на клиенте:

    AutoBean<UserProxy> bean = AutoBeanCodex.decode(userAutoBeanFactory, UserProxy.class, json);

Создание внутрипроцессного RequestFactory на сервере ( tutorial ):

public static <T extends RequestFactory> T create( Class<T> requestFactoryClass ) {
  ServiceLayer serviceLayer = ServiceLayer.create();
  SimpleRequestProcessor processor = new SimpleRequestProcessor( serviceLayer );
  T factory = RequestFactorySource.create( requestFactoryClass );
  factory.initialize( new SimpleEventBus(), new InProcessRequestTransport(processor) );
  return factory;
}
3 голосов
/ 27 марта 2012

Вы также можете использовать AutoBeans для этого, если вы можете сделать User implements UserProxy. Это работает, поскольку Прокси являются интерфейсами с геттерами / сеттерами:

interface UserFactory implements AutoBeanFactory
{
  AutoBean<UserProxy> user(UserProxy toWrap); // wrap existing instance in an AutoBean
}

Затем на сервере вы можете создать autobean и сериализовать в json:

UserFactory factory = AutoBeanFactorySource.create(UserFactory.class)
AutoBean<UserProxy> userProxyBean = factory.user( existingUserPojo );

// to convert AutoBean to JSON
String json = AutoBeanCodex.encode(userProxyBean).getPayload();

На клиенте вы можете просто использовать AutoBeanCodex.decode для десериализации JSON обратно в bean-компонент

1 голос
/ 08 апреля 2012

Я нашел ответ на GWT Google Group .Все кредиты идут на Nisha Sowdri NM .

Кодировка на стороне сервера:

DefaultProxyStore store = new DefaultProxyStore();
ProxySerializer ser = requests.getSerializer(store);
final String key = ser.serialize(userProxy);
String message = key + ":" + store.encode();

Декодирование на стороне клиента:

String[] parts = message.split(":", 2);
ProxyStore store = new DefaultProxyStore(parts[1]);
ProxySerializer ser = requests.getSerializer(store);
UserProxy user = ser.deserialize(UserProxy.class, parts[0]);
1 голос
/ 17 марта 2012

Вы не можете вызвать GWT.create на сервере (или из любой реальной JVM), но во многих случаях вы можете вместо этого вызвать JVM-совместимый метод, предназначенный для использования на сервере.В этом случае взгляните на RequestFactorySource.create.

Может быть немного грязно заставить сервер читать из себя и распечатывать данные, используя RequestFactory - вот демонстрационный пример того, как это может работать (используя gwt 2.4, основная ветвь имеет то же самое для 2.3 или около того) https://github.com/niloc132/tvguide-sample-parent/blob/gwt-2.4.0/tvguide-client/src/main/java/com/acme/gwt/server/TvViewerJsonBootstrap.java - не совсем то же самое, что вы ищите, но может быть возможно использовать эту же идею для заполнения строки в проксихранилище, которое может быть прочитано в клиенте (см. здесь https://github.com/niloc132/tvguide-sample-parent/blob/gwt-2.4.0/tvguide-client/src/main/java/com/acme/gwt/client/TvGuide.java).

Основная идея - создать запрос (включая идентификаторы, вызовы и аргументы with (), чтобы прокси-конструктор сделал все правильно)последовательным образом), и передайте его в экземпляр SimpleRequestProcessor, который затем будет запускать его через серверные части, как обычно (любая система управления объектами, вероятно, все еще должна иметь кэшированные объекты, чтобы избежать дополнительного поиска, в противном случае вынеобходимо смоделировать некоторые из внутренних функций SRP.) ProxySerializer, в который входит ProxyStore, ожидает полных сообщений RF, отправленных с сервера.ver, так что правильное ведение учета сообщений должно быть сделано правильно.

...