/ / GWT ręcznie serializuje obiekt domeny na serwerze - java, gwt, gwt2, requestfactory, autobean

GWT ręcznie serializuje obiekt domeny na serwerze - java, gwt, gwt2, requestfactory, autobean

Pierwszą rzeczą, którą robi moja aplikacja GWT, gdy się ładuje, jestzażądać bieżącego zalogowanego użytkownika od serwera za pośrednictwem RequestFactory. To blokuje, ponieważ potrzebuję właściwości użytkownika, aby wiedzieć, jak postępować. To zajmuje tylko <500ms, ale naprawdę denerwuje mnie, że aplikacja jest w tym czasie zablokowana. Mam już użytkownika na serwerze, gdy generowany jest jsp, więc dlaczego po prostu nie dodać serializowanego użytkownika do jsp i całkowicie wyeliminować to żądanie?

Mam dwa problemy powstrzymujące mnie przed zrobieniem tego:

  • Muszę przekształcić użytkownika w UserProxy
  • Muszę serializować UserProxy w sposób, który GWT może łatwo dokonać deserializacji.

Nie znalazłem dobrego sposobu na zrobienie # 1. Ta logika wydaje się być ukryta w ServiceLayerDecorator bez łatwego sposobu na izolację? Mogę się tutaj mylić.

Drugi wydaje się łatwiejszy za pośrednictwem ProxySerializer Ale jak mogę dostać się do fabryki żądań, gdy jestem na serwerze? Nie możesz zadzwonić GWT.create na serwerze.

Patrzyłem na AutoBeans ale to nie obsługuje powyższego punktu 1. Mój UserProxy zawiera odniesienia do kolekcji innych EntityProxy, które chciałbym zachować.

Odpowiedzi:

5 dla odpowiedzi № 1

Możliwe jest użycie AutoBeans, jeśli utworzysz AutoBeanFactory dla swoich serwerów proxy:

  • Aby przekształcić użytkownika w UserProxy: Utwórz stronę serwera RequestFactory i wywołaj tę samą normalną prośbę. Odpowiedź będzie zawierać UserProxy (ale na serwerze).

  • Aby serializować UserProxy:

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

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

  • Aby deserializować UserProxy na kliencie:

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

Tworzenie procesowego RequestFactory na serwerze (seminarium):

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 dla odpowiedzi № 2

Możesz również użyć do tego AutoBeans, jeśli możesz User implements UserProxy. Działa, ponieważ proxy są interfejsami z modułami pobierającymi / ustawiającymi:

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

Następnie na serwerze możesz utworzyć autobean i serializować do json:

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

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

Na kliencie możesz po prostu użyć AutoBeanCodex.decode, aby dokonać deserializacji JSON z powrotem do komponentu bean


1 dla odpowiedzi nr 3

Nie można wywoływać pliku GWT.create na serwerze (ani z żadnej prawdziwej maszyny JVM), ale w wielu przypadkach można zamiast tego wywołać metodę zgodną z technologią JVM zaprojektowaną do użytku na serwerze. W takim przypadku spójrz na RequestFactorySource.create.

Dostanie się do serwera może być trochę nieporządneodczytaj z siebie i wydrukuj dane za pomocą RequestFactory - oto przykładowy przykład tego, jak to może działać (używając gwt 2.4, główna gałąź ma to samo dla 2.3 lub więcej) https://github.com/niloc132/tvguide-sample-parent/blob/gwt-2.4.0/tvguide-client/src/main/java/com/acme/gwt/server/TvViewerJsonBootstrap.java - niezupełnie to, czego szukasz, ale możliwe jest użycie tego samego pomysłu do wypełnienia ciągu w magazynie proxy, który można odczytać w kliencie (patrz tutaj https://github.com/niloc132/tvguide-sample-parent/blob/gwt-2.4.0/tvguide-client/src/main/java/com/acme/gwt/client/TvGuide.java).

Podstawową ideą jest utworzenie żądania (w tym identyfikatorów, wywołań i argumentów with (), aby konstruktor proxy tworzy wszystkie odpowiednie elementy w spójny sposób) i przekazanie go do SimpleRequestProcessor wystąpienie, które następnie uruchomi go przezczęści serwera zwykle. (Każdy system zarządzania jednostkami prawdopodobnie powinien nadal mieć takie podmioty w pamięci podręcznej, aby uniknąć dodatkowego wyszukiwania, w przeciwnym razie trzeba modelować część pracy, którą SRP wykonuje wewnętrznie.) ProxySerializer, który otacza a ProxyStore, oczekuje, że będą mieć pełne wiadomości RF wysyłane z serwera, więc sporo księgowości wiadomości musi być wykonane poprawnie.


1 dla odpowiedzi nr 4

Znalazłem odpowiedź na GWT Grupa Google. Wszystkie kredyty trafiają do Nisha Sowdri NM.

Kodowanie po stronie serwera:

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

Dekodowanie po stronie klienta:

String[] parts = message.split(":", 2);
ProxyStore store = new DefaultProxyStore(parts[1]);
ProxySerializer ser = requests.getSerializer(store);
UserProxy user = ser.deserialize(UserProxy.class, parts[0]);