/ / GWT вручну серіалізує об'єкт домену на сервері - java, gwt, gwt2, requestfactory, autobean

GWT вручну серіалізувати об'єкт домену на сервері - java, gwt, gwt2, requestfactory, autobean

Перше, що робить моя програма GWT при завантаженні, цезапитувати поточного зареєстрованого користувача з сервера через RequestFactory. Це блокується, оскільки мені потрібні властивості Користувача, щоб знати, як діяти далі. Це займає лише <500 мс, але мене справді дратує, що додаток заблоковано в цей час. У мене вже є Користувач на сервері, коли генерується jsp, то чому б просто не додати серіалізованого Користувача до jsp і не виключити цей запит взагалі?

У мене є дві проблеми, які заважають мені робити це:

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

Я не придумав хорошого способу №1. Ця логіка схована в ServiceLayerDecorator без простого способу ізоляції? Тут я можу помилятися.

Другий здається простішим через ProxySerializer Але як мені отримати до рук фабрику запитів, коли я перебуваю на сервері? Ви не можете телефонувати GWT.create на сервері.

Я розглядав AutoBeans але це не обробляє No1 вище. Мій UserProxy містить посилання на колекції інших EntityProxy, які я хотів би підтримувати.

Відповіді:

5 за відповідь № 1

Можливо використання 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 на сервері (підручник):

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 для відповіді № 2

Ви також можете використовувати AutoBeans для цього, якщо зможете зробити User implements UserProxy. Це працює, оскільки Proxies - це інтерфейси з геттерами / сеттерами:

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 назад до компонента


1 для відповіді № 3

Ви не можете викликати 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)

Основна ідея полягає в тому, щоб створити запит (включаючи ідентифікатори, виклики та аргументи (), щоб проксі-конструктор послідовно робив усі потрібні фрагменти), і передавати його в SimpleRequestProcessor екземпляр, який потім запустить його черезсерверних частин, як правило. (Будь-яка система управління сутністю, мабуть, все одно повинна мати кешовані сутності, щоб уникнути додаткового пошуку, інакше вам потрібно змоделювати деякі роботи, які SRP не виконує внутрішньо.) ProxySerializer, який обгортає a ProxyStore, очікує отримання повних RF-повідомлень, які надсилаються із сервера, тому достатньо велику кількість бухгалтерії повідомлень потрібно робити правильно.


1 для відповіді № 4

Я знайшов відповідь на GWT Група Google. Усі кредити переходять до Ніша Совдрі Н.М..

Кодування на стороні сервера:

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]);