2012-03-17 6 views
5

La prima cosa che l'app GWT esegue quando viene caricata è richiesta dall'utente corrente connesso dal server tramite RequestFactory. Questo blocca perché ho bisogno delle proprietà dell'utente per sapere come procedere. Questo richiede solo < 500 ms, ma mi dà davvero fastidio che l'app sia bloccata durante questo periodo. Ho già l'utente sul server quando viene generato il jsp, quindi perché non aggiungere semplicemente l'utente serializzato al jsp ed eliminare completamente questa richiesta?GWT serializza manualmente l'oggetto dominio sul server

Ho due problemi che mi impedisce di fare questo:

  • Ho bisogno di trasformare l'utente a userProxy
  • ho bisogno di serializzare userProxy in un modo che è facile per GWT per deserializzare.

Non ho trovato un buon modo per fare # 1. Questa logica sembra essere sepolta in ServiceLayerDecorator senza un modo semplice per isolare? Potrei sbagliarmi qui.

Il secondo sembra più semplice tramite ProxySerializer Ma come faccio a mettere le mani su requestfactory quando sono sul server? Non è possibile chiamare GWT.create sul server.

Ho esaminato AutoBeans ma questo non gestisce il numero 1 sopra. Il mio UserProxy ha riferimenti a raccolte di altri EntityProxy che vorrei mantenere.

risposta

1

Non è possibile chiamare GWT.create sul server (o da qualsiasi JVM reale), ma in molti casi è possibile chiamare un metodo compatibile con JVM progettato per l'utilizzo da parte del server. In questo caso, dai un'occhiata a RequestFactorySource.create.

Può essere un po 'complicato ottenere il server per leggere da solo e stampare i dati utilizzando RequestFactory - ecco un esempio dimostrativo di come questo può funzionare (usando gwt 2.4, il ramo principale ha la stessa cosa per 2.3 o quindi) https://github.com/niloc132/tvguide-sample-parent/blob/gwt-2.4.0/tvguide-client/src/main/java/com/acme/gwt/server/TvViewerJsonBootstrap.java - non proprio la stessa cosa che si sta cercando, ma potrebbe essere possibile utilizzare questa stessa idea per popolare una stringa in un archivio proxy che può essere letto nel client (visto qui https://github.com/niloc132/tvguide-sample-parent/blob/gwt-2.4.0/tvguide-client/src/main/java/com/acme/gwt/client/TvGuide.java).

L'idea di base è creare una richiesta (inclusi id, invocazioni e con() argomenti in modo che il proxy builder realizzi tutti i pezzi giusti in modo coerente) e passarla in un'istanza SimpleRequestProcessor, che verrà poi eseguita attraverso i pezzi del server normalmente. (Qualsiasi sistema di gestione delle entità probabilmente dovrebbe avere ancora le entità memorizzate nella cache per evitare una ricerca aggiuntiva, altrimenti è necessario modellare internamente alcune delle SRP di lavoro.) Lo ProxySerializer, che esegue il wrapping di ProxyStore, prevede di avere i messaggi RF completi inviati dal server, quindi un bel po 'di contabilità dei messaggi deve essere fatto correttamente.

+0

Questo mi ha fatto abbastanza lontano, ma proxySerializer.get (UserProxy.class, UserProxy.STORE_KEY) è nullo . Tuttavia, proxyStore.get (UserProxy.STORE_KEY) restituisce uno Splittable che sembra corretto (almeno quando sputa come una stringa). È difficile rintracciare dal momento che gran parte di questo sembra essere il codice generato. – Brad

+0

Ho scritto la maggior parte di questo (tentativi ed errori) circa un anno fa, e apparentemente ho fatto un pessimo lavoro di tenerlo aggiornato - ci riproverò per aggiornarlo, per vedere quali pezzi mi mancano. –

3

È possibile utilizzare AutoBeans anche per questo se è possibile effettuare User implements UserProxy. Funziona dal proxy sono interfacce con getter/setter:

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

Poi, il server a cui si può creare l'autobean e serializzare JSON:

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

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

Sul client si può semplicemente utilizzare AutoBeanCodex.decodificare di deserializzare JSON di nuovo ad un fagiolo

+0

Sfortunatamente 'Utente' non ha potuto implementare' UserProxy' poiché ha accessors come 'OrganizationProxy getOrganization()' dove il tipo di ritorno differisce se siamo un proxy o un modello di dominio. – Brad

+0

Vero, RF non ti consente di farlo in questo caso. – Andrejs

+0

Non sono disposto ad ammettere che non c'è soluzione :) La soluzione di Colin sopra è molto vicina. Non ho avuto il tempo di immergermi più a fondo e scoprire dove è stato catturato. Grazie per l'aiuto! – Brad

5

E 'possibile utilizzare AutoBeans se si crea un AutoBeanFactory per i proxy:

  • Per trasformare l'utente a userProxy: Creare un lato server RequestFactory e richiamare il stessa richiesta normale. La risposta conterrà UserProxy (ma sul server).

  • per serializzare userProxy:

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

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

  • deserializzare userProxy sul client:

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

Creazione di un RequestFactory in-process sul server (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; 
} 
1

ho trovato la risposta al GWT Google Group. Tutti i crediti vanno a Nisha Sowdri NM.

codifica lato server:

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

client di decodifica lato:

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