【问题标题】:GWT manually serialize domain object on serverGWT 手动序列化服务器上​​的域对象
【发布时间】:2012-04-02 21:48:15
【问题描述】:

我的 GWT 应用程序加载时要做的第一件事是通过 RequestFactory 从服务器请求当前登录的用户。这会阻塞,因为我需要用户的属性才能知道如何继续。这只需要

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

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

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

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

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

【问题讨论】:

    标签: java gwt gwt2 requestfactory autobean


    【解决方案1】:

    如果您为代理创建 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 (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;
    }
    

    【讨论】:

      【解决方案2】:

      如果您能够制作User implements UserProxy,您也可以为此使用 AutoBeans。它之所以有效,是因为代理是与 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

      【讨论】:

      • 不幸的是,User 无法实现 UserProxy,因为它具有诸如 OrganizationProxy getOrganization() 之类的访问器,无论我们是代理还是域模型,返回类型都不同。
      • 没错,在这种情况下,RF 不会让你这样做。
      • 我不愿意承认没有解决方案 :) Colin 的上述解决方案非常接近。我只是没有时间深入研究并找到它被赶上的地方。不过感谢您的帮助!
      • 我确定有可能,不确定 API 是否公开
      【解决方案3】:

      您不能在服务器上(或从任何真正的 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 内部所做的一些工作进行建模。)包装了 ProxyStoreProxySerializer 期望有完整的 RF 消息由于是从服务器发送的,因此需要正确地完成相当多的消息簿记。

      【讨论】:

      • 这让我走得很远,但 proxySerializer.get(UserProxy.class, UserProxy.STORE_KEY) 为空。但是,proxyStore.get(UserProxy.STORE_KEY) 返回一个看起来正确的拆分表(至少当它作为字符串吐出时)。它很难追踪,因为其中大部分似乎是生成的代码。
      • 大约一年前我写了大部分内容(反复试验),显然在保持更新方面做得很差 - 我会再试一次以使其更新,看看我错过了什么。
      【解决方案4】:

      我在 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]);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-05
        • 1970-01-01
        • 2017-01-19
        • 1970-01-01
        • 1970-01-01
        • 2010-10-18
        相关资源
        最近更新 更多