5

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

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

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

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

第二个通过ProxySerializer似乎更容易但是当我在服务器上时如何获得 requestfactory 呢?您不能GWT.create在服务器上调用。

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

4

4 回答 4

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;
}
于 2012-03-29T19:00:41.960 回答
3

如果您能够制作User implements UserProxy. 它之所以有效,是因为代理是与 getter/setter 的接口:

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

然后在服务器上,您可以创建 autobean 并序列化为 json:

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

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

在客户端上,您可以使用 AutoBeanCodex.decode 将 JSON 反序列化回 bean

于 2012-03-27T13:12:02.653 回答
1

我在 GWT Google Group上找到了答案。所有学分都归于 Nisha Sowdri NM

服务器端编码:

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

客户端解码:

String[] parts = message.split(":", 2);
ProxyStore store = new DefaultProxyStore(parts[1]);
ProxySerializer ser = requests.getSerializer(store);
UserProxy user = ser.deserialize(UserProxy.class, parts[0]);
于 2012-04-08T17:02:23.947 回答
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)。

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

于 2012-03-17T19:10:03.810 回答