通过 GWT-RPC 发送持久的 JDO 实例
Posted
技术标签:
【中文标题】通过 GWT-RPC 发送持久的 JDO 实例【英文标题】:Sending persisted JDO instances over GWT-RPC 【发布时间】:2010-11-06 13:27:49 【问题描述】:我刚刚开始学习 Google Web Toolkit 并完成了 Stock Watcher 教程应用程序的编写。
我的想法是正确的,如果想要持久化一个业务对象(如股票)使用 JDO 并将其发送来回发送到/从客户端 通过 RPC,然后必须为该对象创建两个单独的类:一个带有 JDO 注释,用于将其持久保存在服务器上,另一个可序列化并通过 RPC 使用?
我注意到 Stock Watcher 有单独的类,我可以推测原因:
否则 gwt 编译器会尝试 为所有内容生成 javascript 引用的持久类 JDO 和 com.google.blah.users.User 等 服务器端也可能有逻辑 不适用于客户端的类 反之亦然。我只是想确保我正确理解了这一点。我不想创建我想通过 RPC 使用的所有业务对象类的两个版本如果我不需要。
【问题讨论】:
【参考方案1】:简短的回答是:您不需要创建重复的类。
我建议您查看以下关于 gwt-contributors 列表的 google 群组讨论:
http://groups.google.com/group/google-web-toolkit-contributors/browse_thread/thread/3c768d8d33bfb1dc/5a38aa812c0ac52b
这是一段有趣的摘录:
如果你只对这些感兴趣,我 描述了一种制作 GAE 和 GWT-RPC 协同工作“出 框”。只需将您的实体声明为: @PersistenceCapable(身份类型 = IdentityType.APPLICATION,可拆卸 = "false") 公共类 MyPojo 实现 Serializable
一切都会奏效,但你会 必须手动处理 发送对象时重新附加 从客户端返回到服务器。
您可以使用此选项,并且不需要镜像 (DTO) 类。 你也可以试试gilead(以前的hibernate4gwt),它负责处理增强对象序列化问题中的一些细节。
【讨论】:
【参考方案2】:您的评估是正确的。我想,JDO 用自己的实现替换了 Collections 的实例,以便在对象图发生变化时进行嗅探。 GWT 编译器不知道这些实现,因此无法序列化它们。这经常发生在由其他符合 GWT 的类型组成但带有 JDO 注释的类中,特别是如果某些对象属性是 Collections。
如需详细解释和解决方法,请查看这篇关于该主题的颇具影响力的文章:http://timepedia.blogspot.com/2009/04/google-appengine-and-gwt-now-marriage.html
【讨论】:
JDO 不会用自己的实现替换集合。例如,DataNucleus 有一个选项可以做到这一点,但默认是使用 java.util.* 类,因此我们不会强制用户在客户端使用 DataNucleus。【参考方案3】:我终于找到了解决办法。根本不要更改您的对象,但对于列表这样做:
List<YourCustomObject> secureList=(List<YourCustomObject>)pm.newQuery(query).execute();
return new ArrayList<YourCustomObject>(secureList);
真正的问题不在于序列化对象...问题是序列化由谷歌实现的Collection类,不允许序列化。
【讨论】:
【参考方案4】:您不必创建两个版本的域模型。
这里有两个提示:
使用字符串编码的密钥,而不是 Appengine Key 类。
pojo = pm.detachCopy(pojo)
...将删除所有 JDO 增强功能。
【讨论】:
【参考方案5】:您根本不必创建单独的实例,实际上最好不要这样做。无论如何,您的 JDO 对象都应该是普通的 POJO,并且永远不应该包含业务逻辑。这是针对您的业务层的,而不是针对您的持久对象本身的。
您需要做的就是包含您正在使用的注释的源代码,GWT 应该可以很好地编译您的类。此外,您希望避免使用 GWT 无法编译的库(例如使用反射的东西等),但在我完成的所有项目中,这从来都不是问题。
【讨论】:
问题不在于他的 JDO 中有业务逻辑,而是 JDO 注释导致了问题(因为 GWT 无法访问源代码,正如您所指出的)。这是 GWT+GAE 中的一个大问题,我希望 Google 能给出一个合适的解决方案。【参考方案6】:我认为通过 GWT 发送对象的更好格式是通过 JSON。在这种情况下,服务器会发送一个 JSON 字符串,然后必须在客户端对其进行解析。优点是在浏览器中呈现的最终 Javascript 的大小更小。从而导致页面加载速度更快。
其次要通过 GWT 发送对象,对象应该是可序列化的。并非所有对象都是这种情况
第三,GWT 具有处理 JSON 的内置函数......所以在客户端没有问题
【讨论】:
发送 JSON 确实简化了交易,但它也消除了 GWT 的一个重要特性:在客户端和服务器上拥有相同的对象模型,而无需手动编写序列化。以上是关于通过 GWT-RPC 发送持久的 JDO 实例的主要内容,如果未能解决你的问题,请参考以下文章