我的GWT应用程序加载时要做的第一件事是通过RequestFactory从服务器请求当前登录用户。这会阻塞,因为我需要用户的属性才能知道如何进行。这只花费了不到500毫秒的时间,但确实让我感到讨厌的是,这段时间该应用程序被阻止了。生成jsp时,我已经在服务器上拥有了User,那么为什么不将序列化的User添加到jsp中并完全消除此请求呢?

我有两个问题使我无法这样做:

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

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

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

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

    最佳答案

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

  • 要将用户转换为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(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;
    }
    

    07-23 13:53