Google Web Toolkit(GWT)+ Google App Engine(GAE)+独立数据持久性

时间:2009-04-14 21:58:20

标签: google-app-engine gwt rpc google-cloud-datastore detach

我想开发一个需要使用GWT和GAE进行数据持久化的Web应用程序。据我了解,我唯一(或至少是最方便的)数据持久性选项是GAE的数据存储区,使用JDO或JPA注释对象。我还希望能够使用GWT远程过程调用(RPC)来回发送我的对象客户端 - 服务器,因此我的对象必须能够“分离”。但是,GWT RPC序列化无法处理分离的JDO / JPA对象,并且它似乎不会在不久的将来出现。

我的问题:对此最简单,最直接的解决方案是什么?能够与服务器端持久性共享相同的客户端/服务器对象将非常方便。

修改

我应该澄清一点,我仍然希望将GWT RPC与GAE的数据存储区一起使用。我只是在寻找能让所有这些技术协同工作的最佳解决方案。

11 个答案:

答案 0 :(得分:7)

答案 1 :(得分:5)

Ray Cromwell有一个temporary hack up。我试过了,它确实有效。

它强制您使用Transient而不是Detachable实体,因为GWT无法序列化DataNucleus使用的隐藏Object [];这意味着您发送到客户端的对象无法插回到数据存储区中,您必须检索实际的数据存储区对象,并将所有持久字段复制回其中。 Ray的方法使用反射来迭代方法,检索getBean()和setBean()方法,并将实体setBean()应用于瞬态gwt对象的getBean()。

你应该努力使用JDO,JPA现在只不过是一个包装类。要使用此hack,必须为每个持久字段使用getter和setter方法,对每个“bean”字段使用PROPER getBean和setBean语法。好吧,ALMOST PROPER,因为它假设所有的getter都以“get”开头,当默认的布尔字段使用是“is”时。

我已经解决了这个问题并在Ray的博客上发表了评论,但它正在等待批准,我不确定他是否会发布它。基本上,我在org.datanucleus包中实现了@GetterPrefix(prefix = MethodPrefix.IS)注释来增强他的工作。

如果没有发布,这是一个问题,请发送电子邮件x_AT_aiyx_DOT_info Re:@GetterPrefix for JDO,我将向您发送修复程序。

答案 2 :(得分:5)

我最近发现了Objectify,它旨在替代JDO。目前还没有多少经验,但它比JDO使用起来更简单,看起来更轻巧,并声称可以通过GWT解决DTO的需求,尽管我还没有尝试过那个特定的功能。

答案 3 :(得分:3)

前一段时间我写了一篇帖子Using an ORM or plain SQL?

  去年,GWT出现了这个问题   申请我写的。很多   从EclipseLink转换为   服务中的表示对象   实现。如果我们使用   ibatis它会变得更加简单   使用创建适当的对象   ibatis然后一路传递它们   上下堆栈。一些纯粹主义者   可能会说这是Bad™。也许是这样(in   理论)但我告诉你:它   会导致更简单的代码,a   更简单的堆栈和更高的生产力。

基本上符合你的观察。

但当然,这不是谷歌应用引擎的一个选项,所以你很难在客户端对象和你的JPA实体之间建立一个转换层。

JPA实体非常严格,因此无论如何它们都不适合在客户端之间来回发送。通常,在执行此操作时,您需要来自多个实体的小位(因此最终会使用某种表示层值对象)。这是你前进的道路。

答案 4 :(得分:3)

Try this。它是一个用于序列化GAE核心类型并将它们发送到GWT客户端的模块。

答案 5 :(得分:2)

您可以考虑使用JSON。 GWT有必要的API解析&在客户端生成JSON字符串。你得到了很多服务器端的JSON API。我尝试使用google-gson,这很好。它将您的JSON字符串转换为POJO模型,反之亦然。希望这有助于您为您的需求提供合适的解决方案

答案 6 :(得分:2)

目前,我使用DTO(DataTransferObject)模式。不一定是干净和更多的样板,但GAE仍然需要相当数量的样板。 ;)

我有一个域对象(通常)与DTO一对一映射。当客户端需要域信息时,DAO(DataAccessObject)会咳嗽Domain对象的DTO表示并通过网络发送。当DTO返回时,我将DAO交给DTO,然后DTO更新所有相应的域对象。

虽然不能直接通过域对象直接通过,但GAE的JDO实现和GWT的序列化过程的局限性意味着这是我目前处理这个问题最简洁的方法。

答案 7 :(得分:2)

我相信Google对此的正式回答是GWT 2.1 RequestFactory。 鉴于你正在使用GWT和GAE,我建议你坚持官方的谷歌框架......我有一个类似的基于GWT / GAE的应用程序,这就是我正在做的。

顺便说一句,设置RequestFactory对于屁股来说有点痛苦。当前的Eclipse插件不包括所有jar,但我能够在Stackoverflow中找到我需要的帮助

答案 8 :(得分:1)

我一直在使用Objectify,我真的很喜欢它。您仍然需要使用pre / postLoad方法进行一些跳舞来翻译,例如文本到字符串并返回。

答案 9 :(得分:0)

因为GWT最终编译为JavaScript,对于分离的持久性,它需要一些可用的服务。最着名的是HTML5商店和Gears(都使用SQLite!)。当然,两者都没有被广泛部署,因此您必须说服您的用户使用现代浏览器或安装一个鲜为人知的插件。如果用户不遵守,请务必降级为可用的子集

答案 10 :(得分:0)

直接使用Datastore API加载/存储POJO域对象怎么样?

它应该与DTO方法相当,意味着例如您必须手动处理所有字段(如果您不使用基于反射的自动化等技巧),它应该为您提供更多的灵活性和对所有数据存储区功能的完全访问权。