2012-03-17 9 views
5

Lo primero que hace mi aplicación GWT cuando se carga es solicitar al usuario que está conectado actualmente desde el servidor a través de RequestFactory. Esto bloquea porque necesito las propiedades del usuario para saber cómo proceder. Esto solo toma < 500ms, pero realmente me molesta que la aplicación esté bloqueada durante este tiempo. Ya tengo el usuario en el servidor cuando se genera el jsp, así que ¿por qué no simplemente agregar el usuario serializado al jsp y eliminar esta solicitud por completo?GWT serializa manualmente el objeto de dominio en el servidor

Tengo dos problemas que me mantiene de esta manera:

  • necesito para transformar usuario a userProxy
  • necesito para serializar userProxy de una manera que es fácil para GWT para deserializar.

No he encontrado una buena manera de hacer # 1. Esta lógica parece estar enterrada en ServiceLayerDecorator sin una forma fácil de aislar? Puedo estar equivocado aquí.

El segundo parece más fácil a través de ProxySerializer Pero, ¿cómo puedo tener en mis manos el requestfactory cuando estoy en el servidor? No puede llamar al GWT.create en el servidor.

He estado buscando en AutoBeans pero esto no funciona con el n. ° 1 anterior. Mi UserProxy tiene referencias a colecciones de otros EntityProxy que me gustaría mantener.

Respuesta

1

No puede llamar a GWT.create en el servidor (o desde cualquier JVM real), pero en muchos casos puede llamar a un método compatible con JVM diseñado para el uso del servidor. En este caso, eche un vistazo a RequestFactorySource.create.

Puede ser un poco desordenado para que el servidor lea de sí mismo e imprima datos usando RequestFactory - aquí hay un ejemplo de demostración de cómo esto puede funcionar (usando gwt 2.4, la rama principal tiene lo mismo para 2.3 o so) https://github.com/niloc132/tvguide-sample-parent/blob/gwt-2.4.0/tvguide-client/src/main/java/com/acme/gwt/server/TvViewerJsonBootstrap.java - no es exactamente lo mismo que usted busca, pero puede ser posible utilizar esta misma idea para rellenar una cadena en una tienda proxy que se pueda leer en el cliente (visto aquí https://github.com/niloc132/tvguide-sample-parent/blob/gwt-2.4.0/tvguide-client/src/main/java/com/acme/gwt/client/TvGuide.java).

La idea básica es crear una solicitud (incluidos identificadores, invocaciones y argumentos() para que el creador de proxy realice todas las piezas correctas de forma coherente) y pasarla a una instancia SimpleRequestProcessor, que luego se ejecutará a través de las piezas del servidor normalmente lo haría. (Cualquier sistema de gestión de entidades probablemente debería tener las entidades en caché para evitar una búsqueda adicional; de lo contrario, debe modelar parte del trabajo que SRP no realiza internamente). El ProxySerializer, que envuelve ProxyStore, espera tener mensajes de RF completos enviados desde el servidor, por lo que debe llevarse a cabo una buena cantidad de contabilidad de mensajes correctamente.

+0

Esto me puso bastante lejos, pero proxySerializer.get (UserProxy.class, UserProxy.STORE_KEY) es nulo . Sin embargo, proxyStore.get (UserProxy.STORE_KEY) devuelve una tabla dividida que parece correcta (al menos cuando escupe como una cadena). Es difícil de rastrear ya que gran parte de esto parece ser código generado. – Brad

+0

Escribí la mayor parte de eso (prueba y error) hace aproximadamente un año, y al parecer he hecho un mal trabajo para mantenerlo actualizado. Lo intentaré de nuevo para actualizarlo, ver qué piezas me faltan. –

3

Puede usar AutoBeans para esto también si puede hacer User implements UserProxy. Funciona desde servidores proxy son interfaces con getters/setters:

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

Luego, el servidor puede crear el autobean y serializar a JSON:

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

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

En el cliente sólo puede utilizar AutoBeanCodex.decodificar deserializar JSON a un bean

+0

Desafortunadamente 'User' no pudo implementar' UserProxy' ya que tiene accesadores como 'OrganizationProxy getOrganization()' donde el tipo de devolución difiere si somos un proxy o un modelo de dominio. – Brad

+0

Es cierto que RF no le permitirá hacerlo en este caso. – Andrejs

+0

No estoy dispuesto a admitir que no hay solución :) La solución de Colin anterior está muy cerca. Simplemente no he tenido tiempo para sumergirme más profundo y encontrar dónde está atrapado. ¡Gracias por la ayuda! – Brad

5

Es posible utilizar AutoBeans si crea una AutoBeanFactory para sus proxies:

  • Transformar usuario a userProxy: Crear un servidor RequestFactory e invocar el la misma solicitud normal. La respuesta contendrá UserProxy (pero en el servidor).

  • para serializar userProxy:

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

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

  • deserializar userProxy en el cliente:

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

Creación de un RequestFactory en proceso en el servidor (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

he encontrado la respuesta en el GWT Google Group. Todos los créditos van a Nisha Sowdri NM.

codificación del lado del servidor:

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

cliente lado de decodificación:

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