/ / GWT manualmente serializar o objeto de domínio no servidor - java, gwt, gwt2, requestfactory, autobean

GWT manualmente serializar o objeto de domínio no servidor - java, gwt, gwt2, requestfactory, autobean

A primeira coisa que meu aplicativo GWT faz quando é carregadosolicitar o atual usuário logado do servidor via RequestFactory. Isso bloqueia porque eu preciso de propriedades do usuário para saber como proceder. Isso leva apenas <500 ms, mas realmente me incomoda que o aplicativo esteja bloqueado durante esse período. Eu já tenho o usuário no servidor quando o jsp é gerado, então porque não basta adicionar o usuário serializado ao jsp e eliminar essa solicitação completamente?

Eu tenho dois problemas para não fazer isso:

  • Preciso transformar o usuário em UserProxy
  • Eu preciso serializar UserProxy de uma maneira que seja fácil para o GWT desserializar.

Eu não descobri uma boa maneira de fazer # 1. Essa lógica parece estar enterrada no ServiceLayerDecorator sem uma maneira fácil de isolar? Eu posso estar errado aqui.

O segundo parece mais fácil via ProxySerializer Mas como coloco minhas mãos no requestfactory quando estou no servidor? Você não pode ligar GWT.create no servidor.

Eu estive procurando AutoBeans mas isso não lida com o # 1 acima. Meu UserProxy tem referências a coleções de outros EntityProxy que eu gostaria de manter.

Respostas:

5 para resposta № 1

É possível usar o AutoBeans se você criar um AutoBeanFactory para seus proxies:

  • Para transformar o usuário em UserProxy: Crie um lado do servidor RequestFactory e invocar o mesmo pedido normal. Resposta conterá UserProxy (mas no servidor).

  • Para serializar UserProxy:

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

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

  • Para desserializar UserProxy no cliente:

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

Criando um RequestFactory em processo no 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 resposta № 2

Você também pode usar o AutoBeans para isso se for capaz de fazer User implements UserProxy. Funciona já que os Proxies são interfaces com getters / setters:

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

Então no servidor você pode criar o autobean e serializar para json:

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

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

No cliente, você pode simplesmente usar o AutoBeanCodex.decode para desserializar o JSON de volta para um bean


1 para resposta № 3

Você não pode chamar GWT.create no servidor (ou em qualquer JVM real), mas, em muitos casos, pode chamar um método compatível com JVM projetado para uso do servidor. Neste caso, dê uma olhada RequestFactorySource.create.

Pode ser um pouco confuso para obter o servidor paraler a partir de si mesmo e imprimir dados usando RequestFactory - aqui está um exemplo de demonstração de como isso pode funcionar (usando gwt 2.4, o ramo principal tem a mesma coisa para 2.3 ou mais) https://github.com/niloc132/tvguide-sample-parent/blob/gwt-2.4.0/tvguide-client/src/main/java/com/acme/gwt/server/TvViewerJsonBootstrap.java - não é exatamente a mesma coisa que você procura, mas pode ser possível usar essa mesma ideia para preencher uma string em um repositório de proxy que possa ser lido no cliente (visto aqui https://github.com/niloc132/tvguide-sample-parent/blob/gwt-2.4.0/tvguide-client/src/main/java/com/acme/gwt/client/TvGuide.java).

A idéia básica é criar uma solicitação (incluindo argumentos ids, invocations e with () para que o construtor de proxy faça todas as partes certas de maneira consistente) e passá-la para um SimpleRequestProcessor exemplo, que, em seguida, executá-lo através dopedaços de servidor normalmente faria. (Qualquer sistema de gerenciamento de entidades provavelmente ainda deve ter as entidades armazenadas em cache para evitar uma pesquisa adicional; caso contrário, você precisará modelar alguns dos trabalhos que o SRP não faz internamente.) ProxySerializer, que envolve um ProxyStore, espera ter mensagens completas de RF como enviadas do servidor, portanto, um bom bocado de contabilidade de mensagens precisa ser feito corretamente.


1 para resposta № 4

Eu encontrei a resposta no GWT Grupo do Google. Todos os créditos vão para Nisha Sowdri NM.

Codificação do lado do servidor:

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

Decodificação do lado do 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]);