2012-03-17 48 views
5

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

我有两个问题让我从这样做:

  • 我需要改造用户到的userProxy
  • 我需要序列化的userProxy的方式,很容易GWT反序列化。

我还没有想出一个好办法吗#1。这种逻辑似乎被埋在ServiceLayerDecorator中,没有简单的方法来隔离?我可能在这里错了。

第二个似乎通过ProxySerializer容易,但我怎么得到我的手requestfactory当我在服务器上?您不能在服务器上拨打GWT.create

我一直在寻找到AutoBeans但不处理#1以上。我的UserProxy引用了我想要维护的其他EntityProxy的集合。

回答

1

您不能调用GWT.create服务器(或从任何真正的JVM),但在很多情况下,你可以调用一个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,调用,并与()参数)来创建一个请求,并把它传递到SimpleRequestProcessor实例,那么这将运行它通过它通常会的服务器部分。 (任何单位的管理制度可能还是应该有缓存,以避免额外的查找实体,否则你需要建模的一些工作SRP的没有按内部)的ProxySerializer,它包装一个ProxyStore,预计从发送到有充分的RF消息服务器,所以需要正确完成一小部分消息簿记。

+0

这让我很远,但proxySerializer.get(UserProxy.class,UserProxy.STORE_KEY)为空。但是,proxyStore.get(UserProxy.STORE_KEY)返回一个显示正确的分割表(至少当它以字符串形式出现时)。它很难追查,因为这似乎是生成代码。 – Brad 2012-03-18 01:27:27

+0

大约一年前,我写了大部分内容(试错),并且显然在保持最新状态方面做得很差 - 我会再试一次以使其更新,查看我失踪的内容。 – 2012-03-18 01:51:41

3

,如果你能做出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客户端。解码反序列化JSON回豆

+0

不幸的是'User'不能实现'UserProxy',因为它具有访问器,比如'OrganizationProxy getOrganization()',其中返回类型不同,无论我们是代理还是域模型。 – Brad 2012-03-27 14:56:38

+0

诚然,在这种情况下,RF不会让你这样做。 – Andrejs 2012-03-27 15:50:09

+0

我不愿意承认没有解决方案:)上面的科林解决方案非常接近。我只是没有时间深入探索,发现它陷入了哪里。感谢您的帮助! – Brad 2012-03-27 18:03:29

5

它使用AutoBeans是可能的,如果您为您的代理的AutoBeanFactory:

  • 要转换的用户来的userProxy: 创建一个服务器端RequestFactory和调用同样的正常请求。响应将包含UserProxy(但在服务器上)。

  • 要序列的userProxy:

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

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

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

  • 在客户端反序列化的userProxy

在服务器上创建一个进程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; 
} 
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]);