通过GWT-RPC发送持久化JDO实例

时间:2009-06-28 23:13:29

标签: gwt jdo gwt-rpc

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

我的想法是否正确如果想要坚持业务对象(如股票)使用JDO并将其来回传送到客户端通过RPC,然后必须为该对象创建两个单独的类:一个具有JDO注释用于在服务器上持久保存,另一个用于可序列化并通过RPC使用?

我注意到Stock Watcher有不同的类,我可以理解为什么:

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

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

6 个答案:

答案 0 :(得分:4)

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

我建议您在gwt-contributors列表中查看以下google论坛讨论:

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

这是一段有趣的摘录:

  

如果这是你感兴趣的全部,我   描述了一种制作GAE和GAE的方法   GWT-RPC协同工作“走出困境   框。“只需将您的实体声明为:   @PersistenceCapable(identityType =   IdentityType.APPLICATION,可拆卸   =“false”)公共类MyPojo实现Serializable {}

     

一切都会奏效,但你会   必须手动处理   发送对象时重新附加   从客户端返回服务器。

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

答案 1 :(得分:2)

您的评估是正确的。 JDO用自己的实现替换了Collections的实例,以便在对象图改变时嗅探,我想。 GWT编译器不知道这些实现,因此无法对它们进行序列化。这通常发生在由其他GWT兼容类型组成的类中,但是使用JDO注释,特别是如果某些对象属性是集合。

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

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:1)

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

以下是两个提示:

使用String编码的密钥,而不是Appengine Key类。

pojo = pm.detachCopy(pojo)

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

答案 4 :(得分:0)

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

您需要做的就是包含您正在使用的注释的来源,GWT应该很好地编译您的课程。另外,你想避免使用GWT无法编译的库(比如使用反射的东西等),但在我所做的所有项目中,这从来都不是问题。

答案 5 :(得分:0)

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

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

第三,GWT内置了处理JSON的功能......所以客户端没有问题