Google App Engine Java SDK 1.2.1在5月13号发布了。这是Google App Engine 宣布支持Java语言以来,首次SDK更新。
SDK更新内容如下:(来自SDK项目WIKI)
- Added validation of appengine-web.xml, cron.xml, and datastore-indexes.xml.
- New <user-permissions> element added to appengine-web.xml to grant custom third-party permissions (e.g. OgnlInvokePermission).
- Support for unindexed datastore properties of arbitrary types.
- Added HTTP Proxy support to appcfg.sh.
- Response limit raised from 1MB to 10MB
Some methods from Servlet 2.5 were missing
Individual bytes read from ServletInputStream were incorrectly signed
Expect header is now ignored, rather than causing 500 errors
Bundled commons-logging-1.2.1.jar can conflict with user-provided jars
Groovy permissions are granted in the local runtime:
Reflection on some JRE classes did not work properly
<url-pattern> elements are now allowed in <jsp-property-group>
JSPs with embedded UTF-8 content are not compiled properly
Static welcome files now take precedence over dynamic welcome files in SDK
Thread.setContextClassLoader() is now supported
Content-Type not set in local implementation of URLFetch API
AppCfg request_logs command is limited to 100 lines
Timestamp added to datastore indexes file uses current locale
Support field restrictions in queries
Fix NPE when querying for null parent
Support contains operator in JDOQL
Support doubles as query literals
Support BigDecimal fields
Support persisting classes with superclasses
Support Collection fields with serialized="true"
Support @Lob JPA annotation
Support @Serialized on byte member
Bidirectional one-to-many when parent has long or unencoded String pk fails
Cannot fetch many side of one-to-many when pk is Key, Long, or unencoded String
JDOQL: Support implicit params
Cannot add child to existing one-to-many if parent has Long or unencoded S
tring pk
Expose batch gets
Can’t reattach detached objects with Date props
Fetching 1 to 1 needs to differentiate between direct and indirect children
Support embedded classes with Key primary key
GAE的Datastore是基于Big Table的,号称是面向对象的数据库(object-oriented database),而不是关系数据库。因此,Datastore是有非常大的局限性的,至少对于熟悉使用关系数据库或SQL的人来说。
1.查询操作符
查询操作符只支持<, <=, ==, >=, >
不支持 !=, IN, LIKE
操作符后面只能跟常量值,不能引用实体的属性
在一个查询里,只允许一个属性使用非等于的操作符(<, <=, >=, >)
2.逻辑操作符
支持 AND(&&)
不支持 OR, NOT
3.排序
在一个查询里,使用了非等于操作符的属性必须在ORDER BY从句必须是在第一位
4.不支持关联查询
不支持JOIN
5.不支持集合函数
不支持group by, having, sum, avg, max, min
其他的以后发现了再补充。
参考:GAE Datastore Queries and Indexes
Google App Engine SDK 有更新了!不过这次释出的只是DataNucleus App Engine plugin,是GAE for Java中的持久层框架,支持JPA和JDO。版本号是1.0.1 Release Candidate 1,下载地址在是:http://datanucleus-appengine.googlecode.com/files/appengine-orm-1.0.1.RC1.zip。这个发布只要是bug fixed,详细的bug fixed 请查看这里。还需要注意的是,这不是官方正式发布的,详细内容请看Google Group。如果以后想查看更多版本的DataNucleus plugin for Google App Engine,可以到这里:http://code.google.com/p/datanucleus-appengine/downloads/list。
1.备份Google App Engine SDK
把\plugins\com.google.appengine.eclipse.sdkbundle_1.2.0.v200904062334\appengine-java-sdk-1.2.0这个目录备份
2.下载DataNucleus App Engine plugin 1.0.1RC1
地址是http://datanucleus-appengine.googlecode.com/files/appengine-orm-1.0.1.RC1.zip
3.把下载的ZIP压缩包解压并覆盖到\plugins\com.google.appengine.eclipse.sdkbundle_1.2.0.v200904062334\appengine-java-sdk-1.2.0
4.移除旧版本的DataNucleus App Engine plugin的jar包
删除\plugins\com.google.appengine.eclipse.sdkbundle_1.2.0.v200904062334\appengine-java-sdk-1.2.0\lib\user\orm\datanucleus-appengine-1.0.0.final.jar
5.重启Eclipse
做了一个简单的一对一(OneToOne)关系的JPA测试,在本地Eclipse中没有问题,但部署到GAE后,添加数据成功而在显示数据的时候却报500错误。幸好GAE控制台有详细错误日志:
/oneone.jsp
java.lang.ClassCastException: com.google.appengine.api.datastore.DatastoreNeedIndexException cannot be cast to javax.servlet.ServletException
at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:754)
at org.apache.jsp.oneone_jsp._jspService(oneone_jsp.java:100)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
看来是忘记给datastore指定,参看GAE的文档Queries And Indexes,赶紧在WEB-INF添加datastore-indexes.xml,再把本地自动生成的index(在WEB-INF/appengine-generated/datastore-indexes-auto.xml中)的内容复制进去,如下:
xmlns=”http://appengine.google.com/ns/datastore-indexes/1.0“
autoGenerate=”true”>
source=”auto” />
重新部署到GAE中,运行正常。
测试地址:http://shoopmanga.appspot.com/oneone.jsp
前段时间申请了一个免费的二级域名shoopman.co.cc(关于co.cc的中文介绍可以点这里,申请地址在http://www.co.cc),在Google App Engine部署了用python写的Blog后,当然也想绑定这个短小的域名到这个Blog上,于是开始了折腾:
1.进入Google App Engine管理中心,选择安装了博客的的应用ID,我这个是“shoopmanlog”,在应用控制台里,点左边的导航菜单的“Version”。
2.在Version页输入了我申请的免费域名”shoopman.co.cc”,点击“Add Domain”按钮,页面居然却跳到了
Google App(Google企业应用套件)的注册页。
3.按照Google App的提示,成功申请了一个Google App的帐号。需要注意的是,Google App暂时不支持中国地区,换一个地区比如美国,就能成功申请了。
5.切换回到Google App中,点击“验证”按钮,Google提示在48个小时内完成验证。
6.我没有那么大的耐心等48小时再做下一步操作,直接到Google App添加Google App Engine服务,如图
8.等待吧,耐心等待域名解析生效吧。。。我的大概是4、5个小时后就生效了,哦也!
GAE不支持spring-orm是因为引用了javax.naming包里的类,而这些类是不被GAE支持的。在spring-orm-2.5.6.jar移去一下类则可:
PersistenceAnnotationBeanPostProcessor.class
PersistenceAnnotationBeanPostProcessor$PersistenceElement.class
PersistenceAnnotationBeanPostProcessor$2.class
PersistenceAnnotationBeanPostProcessor$1.class
这个我还没有验证过。出自Google Group。
2009-4-8,Google App Engine for Java开张了。可惜的是,我在网上看到这些消息时,已经是4-9,而且网上还说的是测试期间仅限前10000申请者。当时那个遗憾啊。。。不过不死心,还是马上申请了。幸好第二天收到了帐号激活的邮件。这里是申请的网址http://appengine.google.com/promo/java_runtime,当然必须要Google帐号。
接着,看来Google Plugin for Eclipse的说明,马上在线安装了插件,开始GAE的测试。已经顺利的把一个Demo改成了通过JPA存储数据,并部署到GAE上来,地址是http://shoopmanga.appspot.com。当然,现在还有不少问题,如中文乱码问题,以后继续研究,慢慢解决。
下面是Google App Engine for Java的一些有用连接: