21

我刚刚开始学习 Google Web Toolkit 并完成了 Stock Watcher 教程应用程序的编写。

我的想法是否正确,如果一个人想要使用 JDO持久化一个业务对象(如股票)并通过 RPC来回发送到客户端/从客户端发送它,那么必须为该对象创建两个单独的类:一个带有 JDO 注释将其持久化在服务器上和另一个可序列化并通过 RPC 使用的?

我注意到 Stock Watcher 有单独的类,我可以推测原因:

  • 否则,gwt 编译器将尝试为所有引用的持久类(如 JDO 和 com.google.blah.users.User 等)生成 javascript
  • 服务器端类也可能存在不适用于客户端的逻辑,反之亦然。

我只是想确保我正确理解了这一点。如果不需要的话,我不想创建我想通过 RPC 使用的所有业务对象类的两个版本。

4

6 回答 6

4

简短的回答是:您不需要创建重复的类

我建议您查看以下关于 gwt-contributors 列表的 google groups 讨论:

http://groups.google.com/group/google-web-toolkit-contributors/browse_thread/thread/3c768d8d33bfb1dc/5a38aa812c0ac52b

这是一段有趣的摘录:

如果这就是您感兴趣的全部内容,我描述了一种使 GAE 和 GWT-RPC“开箱即用”协同工作的方法。只需将您的实体声明为:@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable = "false") public class MyPojo implements Serializable { }

一切都会正常工作,但是在将对象从客户端发送回服务器时,您必须手动处理重新附加。

您可以使用此选项,并且不需要镜像 (DTO) 类。你也可以试试gilead(以前的 hibernate4gwt),它负责处理增强对象序列化问题中的一些细节。

于 2009-09-29T13:31:36.507 回答
2

我终于找到了解决方案。根本不要更改您的对象,但对于列表,请这样做:

List<YourCustomObject> secureList=(List<YourCustomObject>)pm.newQuery(query).execute();
return new ArrayList<YourCustomObject>(secureList);

实际问题不在于序列化对象......问题是序列化由 Google 实现的 Collection 类,不允许序列化。

于 2011-01-28T09:46:59.340 回答
2

你的评估是正确的。我想,JDO 用自己的实现替换了 Collections 的实例,以便在对象图发生变化时进行嗅探。GWT 编译器不知道这些实现,因此无法序列化它们。对于由其他符合 GWT 的类型但带有 JDO 注释的类来说,这种情况经常发生,尤其是在某些对象属性是集合的情况下。

有关详细解释和解决方法,请查看这篇关于该主题的非常有影响力的文章:http: //timepedia.blogspot.com/2009/04/google-appengine-and-gwt-now-marriage.html

于 2009-06-30T05:43:14.257 回答
1

您不必创建两个版本的域模型。

这里有两个提示:

使用字符串编码的密钥,而不是 Appengine Key 类。

pojo = pm.detachCopy(pojo)

...将删除所有 JDO 增强功能。

于 2010-05-06T23:50:11.703 回答
0

我认为通过 GWT 发送对象的更好格式是通过 JSON。在这种情况下,服务器会发送一个 JSON 字符串,然后必须在客户端对其进行解析。优点是在浏览器中呈现的最终 Javascript 的大小更小。从而导致页面加载速度更快。

其次要通过 GWT 发送对象,对象应该是可序列化的。这可能不是所有对象的情况

第三,GWT 具有处理 JSON 的内置函数......所以在客户端没有问题

于 2013-01-25T12:23:55.710 回答
0

您根本不必创建单独的实例,实际上最好不要这样做。无论如何,您的 JDO 对象都应该是普通的 POJO,并且永远不应该包含业务逻辑。这是针对您的业务层的,而不是针对您的持久对象本身的。

您需要做的就是包含您正在使用的注释的源代码,GWT 应该可以很好地编译您的类。此外,您希望避免使用 GWT 无法编译的库(例如使用反射的东西等),但在我所做的所有项目中,这从来都不是问题。

于 2009-06-29T22:16:54.570 回答