GWT手动序列化服务器上​​的域对象

Bra*_*rad 5 java gwt gwt2 requestfactory autobean

我的GWT应用程序加载时首先要做的是通过RequestFactory从服务器请求当前登录用户.这会阻止,因为我需要用户的属性才能知道如何继续.这只需要<500毫秒,但在此期间应用程序被阻止真的让我感到很恼火.生成jsp时,我已经在服务器上安装了User,那么为什么不将序列化的User添加到jsp中并完全消除这个请求呢?

我有两个问题阻止我这样做:

  • 我需要将User转换为UserProxy
  • 我需要以一种易于GWT反序列化的方式序列化UserProxy.

我还没有找到一个做好#1的好方法.这个逻辑似乎埋没在ServiceLayerDecorator中,没有一种简单的方法可以隔离?我可能在这里错了.

第二个似乎通过ProxySerializer更容易但是当我在服务器上时如何获得requestfactory?你不能GWT.create在服务器上打电话.

我一直在研究AutoBeans,但这并没有处理上面的#1.我的UserProxy引用了我想要维护的其他EntityProxy的集合.

And*_*ejs 5

如果为代理创建AutoBeanFactory,则可以使用AutoBeans:

  • 将User转换为UserProxy: 创建服务器端RequestFactory并调用相同的普通请求.响应将包含UserProxy(但在服务器上).

  • 要序列化UserProxy:

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

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

  • 要在客户端上反序列化UserProxy:

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

在服务器上创建进程内RequestFactory(教程):

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;
}
Run Code Online (Sandbox Code Playgroud)


Col*_*rth 1

您无法在服务器上(或从任何真正的 JVM)调用 GWT.create,但在许多情况下,您可以调用专为服务器使用而设计的 JVM 兼容方法。在这种情况下,请看一下RequestFactorySource.create

让服务器从自身读取并使用 RequestFactory 打印数据可能有点混乱 - 这是一个演示示例,说明了它是如何工作的(使用 gwt 2.4,主分支在 2.3 左右有相同的东西)https : //github.com/niloc132/tvguide-sample-parent/blob/gwt-2.4.0/tvguide-client/src/main/java/com/acme/gwt/server/TvViewerJsonBootstrap.java - 不太一样你在后面,但也许可以使用同样的想法来填充代理存储中的字符串,该字符串可以在客户端中读取(参见此处https://github.com/niloc132/tvguide-sample-parent/blob/ gwt-2.4.0/tvguide-client/src/main/java/com/acme/gwt/client/TvGuide.java)。

基本思想是创建一个请求(包括 ids、调用和 with() 参数,以便代理构建器以一致的方式生成所有正确的部分),并将其传递到实例中SimpleRequestProcessor,然后该实例将通过服务器部分运行它通常会的。(任何实体管理系统可能仍然应该缓存实体以避免额外的查找,否则您需要对 SRP 内部不做的一些工作进行建模。) 包装了ProxySerializerProxyStore期望具有从服务器发送的完整 RF 消息,因此需要正确地完成相当多的消息簿记。