使用Google App Engine开发中遇到的几个错误

当前使用的GAE版本为1.2.1 for java
1. 使用Eclipse时出现编译警告(XXX has annotations but there is no registered AnnotationReader. Please check your CLASSPATH and the annotations in the class for validity. )
解决办法:修改ORM Enhancement(http://code.google.com/eclipse/docs/appengine_orm.html)
参考链接: http://groups.google.com/group/google-appengine-java/browse_thread/thread/90850aad49730245
2. 发送邮件时发生com.google.apphosting.api.ApiProxy$CallNotFoundException
解决办法:单纯的运行邮件发送程序是不行的,需要发布后再执行。如果需要单元测试,需要配置setUp与tearDown

1     @BeforeTest
2 public void setUp() throws Exception {
3         ApiProxy.setEnvironmentForCurrentThread(new TestEnvironment());
4         ApiProxy.setDelegate(new ApiProxyLocalImpl(new File(".")) {});
5     }
6     @AfterTest
7 public void tearDown() throws Exception {
8 // not strictly necessary to null these out but there's no harm either
9         ApiProxy.setDelegate(null);
10         ApiProxy.setEnvironmentForCurrentThread(null);
11     }

参考链接:http://groups.google.com/group/google-appengine-java/browse_thread/thread/debc5bcb69a6871f
3. 前台处理要显示数据时发生org.datanucleus.exceptions.NucleusUserException
解决办法:在PersistenceManager.close()前,使用PersistenceManager.detachCopy(DATA)返回数据
4. 使用SpringMVC发生java.lang.NoClassDefFoundError: javax/naming/NamingException
解决办法:不要使用spring all-in-one.jar,使用需要的各个模块jar
参考链接:http://groups.google.com/group/google-appengine-java/browse_thread/thread/f1a541fe52e172dd
5. one-to-many情况下使用Collection.add()发生java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.String
解决办法:one的主键不要使用Long,使用String或Key等。
参考链接:http://groups.google.com/group/google-appengine-java/browse_thread/thread/10e6cede7fb678f3/62d9505da8ec43bd
6. 不能插入one-to-many中的many方数据
解决办法:JDO这点做的让人比较不适应,需要手动维护one方的关系才行,具体步骤为:
a)检索出one
b)维护many对象的one关系
c)维护one对象的many配列关系(重要)
d)保存
e)保证以上操作在一个事务中进行
示例代码:

1         Child c = new Child();
2         PersistenceManager manager = JdoUtil.getPMF().getPersistenceManager();
3         Parent p = manager.getObjectById(Parent.class, Parent.getId());
4         c.setParent(p);
5         p.getChildren().add(c); // important
6         manager.makePersistent(c);
7         manager.close();

GAE for java 还处在发展阶段,像JDO/JPA、File upload、image api等的处理还有不少需要完善的地方。
由上面的第6点可以看出,事务处理是一个比较棘手的课题。我的下个目标就是要好好设计它,也许OSIV是个不错的选择:-)

 1. org.datanucleus.store.exceptions.NoTableManagedException: Persistent class XXX does not seem to have been enhanced.
解决办法:有些时候POJO会"坏掉",重新保存一下即可:-)
参考链接:http://groups.google.com/group/google-appengine-java/browse_thread/thread/45423b96b786264b

2. org.datanucleus.exceptions.NucleusUserException A parent cannot be established or changed once an object has been persisted.
这个非常让我头痛。目前一对多情况下当多方确定了一,则再也不能改变了。
解决办法:暂时设立冗余字段。
参考链接:http://groups.google.com/group/google-appengine-java/browse_thread/thread/cf5821f1394f65a0/8ec90e9b84fcc8ee

3. java.lang.IllegalArgumentException: can't operate on multiple entity groups in a single transaction
解决办法:目前GAE只支持一个事务操作一个实体。
参考链接:http://groups.google.com/group/google-appengine-java/browse_thread/thread/04f35b443c15d531

4. web.xml中的welcome-file设置问题。本地运行正常,放到appspot里运行失败。
解决办法:
OK: <welcome-file>index.jsp</welcome-file>
NG: <welcome-file>/index.jsp</welcome-file>
参考链接:http://groups.google.com/group/google-appengine-java/browse_thread/thread/31af226dcc0c57a4/6aff8f3e46468bec#6aff8f3e46468bec

另外,GAE不支持文件写入流(否则就变成无限网络硬盘了)。本想做个网站静态化,结果只能做伪静态化了:P
参考链接:http://groups.google.com/group/google-appengine-java/browse_thread/thread/ef91a0e8c32c576e

posted @ 2009-09-20 23:01  senzjx  阅读(1615)  评论(0编辑  收藏  举报