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

通过GWT-RPC发送持久化JDO实例,gwt,jdo,gwt-rpc,Gwt,Jdo,Gwt Rpc,我刚刚开始学习GoogleWebToolkit,并完成了StockWatcher教程应用程序的编写 如果一个人想要坚持一个业务对象(比如股票),我的想法正确吗使用JDO并通过RPC将其来回发送到客户机,然后必须为该对象创建两个独立的类:一个带有JDO注释,用于在服务器上持久化该对象,另一个可序列化并通过RPC使用 我注意到股票观察者有不同的类别,我可以从理论上解释原因: 否则gwt编译器将尝试 为所有内容生成javascript 持久化类引用如下 JDO和com.google.blah.use

我刚刚开始学习GoogleWebToolkit,并完成了StockWatcher教程应用程序的编写

如果一个人想要坚持一个业务对象(比如股票),我的想法正确吗使用JDO并通过RPC将其来回发送到客户机,然后必须为该对象创建两个独立的类:一个带有JDO注释,用于在服务器上持久化该对象,另一个可序列化并通过RPC使用

我注意到股票观察者有不同的类别,我可以从理论上解释原因:

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

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

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


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

您的评估是正确的。JDO用自己的实现替换集合实例,以便在对象图更改时进行嗅探。GWT编译器不知道这些实现,因此无法序列化它们。对于由其他GWT兼容类型组成但带有JDO注释的类,这种情况经常发生,特别是当某些对象属性是集合时


有关详细的解释和解决方法,请查看这篇关于此主题的非常有影响力的文章:

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

我建议您在gwt贡献者列表上查看以下google Group讨论:

以下是一段有趣的摘录:

如果这就是你感兴趣的,我 描述了一种制作GAE和 GWT-RPC合作“走出困境” 盒子”。只需将您的实体声明为: @PersistenceCapable(标识类型= IdentityType.APPLICATION,可分离 =“false”)公共类MyPojo实现可序列化的{}

一切都会成功,但你会成功的 必须手动处理 发送对象时重新连接 从客户端返回到服务器

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

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

这里有两个提示:

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

pojo = pm.detachCopy(pojo)

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

我终于找到了解决方案。完全不要更改对象,但对于清单,请按以下方式进行更改:

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

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

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

其次,要通过GWT发送对象,对象应该是可序列化的。并非所有对象都是如此


第三,GWT具有处理JSON的内置函数。。。因此,客户端没有问题

JDO不会用自己的实现取代集合。例如,DataNucleus有一个选项可以这样做,但默认情况下使用java.util.*类,这样我们就不会强迫用户将DataNucleus存在于客户端。问题不是他在JDO中有业务逻辑,而是JDO注释造成了问题(正如您所指出的,因为GWT无权访问源代码)。这是GWT+GAE中的一个大问题,我希望谷歌能提出一个合适的解决方案。发送JSON确实简化了交易,但也消除了GWT的一个重要功能:在客户端和服务器上都有相同的对象模型,而不必手动编写序列化。