/ / GWT serializa manualmente el objeto de dominio en el servidor: java, gwt, gwt2, requestfactory, autobean

GWT serializa manualmente el objeto de dominio en el servidor: java, gwt, gwt2, requestfactory, autobean

Lo primero que hace mi aplicación GWT cuando se carga essolicite al usuario conectado actualmente desde el servidor a través de RequestFactory. Esto bloquea porque necesito propiedades del usuario para saber cómo proceder. Esto solo toma <500 ms, 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, entonces, ¿por qué no simplemente agregar el Usuario serializado al jsp y eliminar esta solicitud por completo?

Tengo dos problemas que me impiden hacer esto:

  • Necesito transformar Usuario a UsuarioProxy
  • Necesito serializar UserProxy de una manera que sea fácil para GWT deserializar.

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

El segundo parece más fácil a través de ProxySerializer Pero, ¿cómo obtengo mis manos en la fábrica de solicitudes cuando estoy en el servidor? No puedes llamar GWT.create en el servidor

He estado investigando AutoBeans pero esto no maneja # 1 arriba. Mi UserProxy tiene referencias a colecciones de otros EntityProxy que me gustaría mantener.

Respuestas

5 para la respuesta № 1

Es posible usar AutoBeans si crea un AutoBeanFactory para sus proxies:

  • Para transformar Usuario a UserProxy: Crear un lado del servidor RequestFactory e invocar 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();

  • Para deserializar UserProxy en el cliente:

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

Crear una 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;
}

3 para la respuesta № 2

También puede usar AutoBeans para esto si puede hacer User implements UserProxy. Funciona ya que los Proxies son interfaces con getters / setters:

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

Luego, en 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, puede usar AutoBeanCodex.decode para deserializar JSON de nuevo a un bean


1 para la respuesta № 3

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 complicado hacer que el servidorlea de sí mismo e imprima datos usando RequestFactory: aquí hay un ejemplo de demostración de cómo puede funcionar esto (usando gwt 2.4, la rama principal tiene lo mismo para 2.3 más o menos) 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 que busca, pero puede ser posible usar esta misma idea para llenar una cadena en una tienda proxy que se puede 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 con () para que el generador de proxy haga todas las piezas correctas de manera coherente) y pasarla a un SimpleRequestProcessor instancia, que luego lo ejecutará a través depiezas del servidor normalmente lo haría. (Cualquier sistema de administración de entidades probablemente todavía debería tener las entidades almacenadas en caché para evitar una búsqueda adicional; de lo contrario, debe modelar parte del trabajo que SRP no hace internamente). ProxySerializer, que envuelve un ProxyStore, espera tener mensajes completos de RF enviados desde el servidor, por lo que una buena parte de la contabilidad de mensajes debe hacerse correctamente.


1 para la respuesta № 4

Encontré la respuesta en el GWT Grupo de Google. 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();

Decodificación del lado del cliente:

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