最近在做一个个人博客,准备放到Google Application Engine上去,本来是想找一个现成的Java版本的博客,找了很久找到了两个源代码,感觉不太合我的心意,于是准备自己做一个玩玩.本博客系统采用的是Struts2.1 + JSTL + Fckeditor + JDO.本博客还在制作中,将过程中的一些方法及经验总结如下:
一.关于异常
1.java.lang.InstantiationException
实例化异常。当试图通过newInstance()方法创建某个类的实例,而该类是一个抽象类或接口时,抛出该异常。
2. gae报错信息:
javax.swing.tree.TreeNode is a restricted class. Please see the Google App Engine developer's guide for more details.
问题原因:
freemarker使用到了gae不允许的class
解决办法:
工程内新建freemarker.core.TextBlock覆盖freemarker类
3.java.lang.ClassCastException: [Ljava.lang.String; cannot be cast to java.lang.String
今天使用request.getParameterMap()获得Map中的数据时,使用
Map map=request.getParameterMap(); if(map.contains(key)){ String value=(String) map.get(key); }
报[Ljava.lang.String; cannot be cast to java.lang.String错误,上网查了才知道get(key)返回的是String[],所以要使用字符串数组才行。
4.诡异的异常:
org.datanucleus.exceptions.NucleusUserException: Object Manager has been closed
Are you using Google App Engine for java and JDO?
If you ask for a list of something you might have to call the method size(). (studip i know)
The code below would throw org.datanucleus.exceptions.NucleusUserException: "Object Manager has been closed" if we removed the call to size()
public List<Customer>getAllCustomers() { List<Customer> customers = new ArrayList(); PersistenceManager pm = pmfInstance.getPersistenceManager(); String query = "select from " + Customer.class.getName(); customers = (List<Customer> pm.newQuery(query).execute(); customers.size(); pm.close(); return customers; }
5.com.google.appengine.api.datastore.Text中toString()与getValue()方法的区别:
getValue()得到的是Text中存储的完整的.符数据,而toString()获得的是该字符的部分内容摘要,格式为<:Text字符数据...>,总长度不超过74个字符.起初我以为两者应该都能返回内部的字符串,因此随便用了一下toString(),结果数据一长就无法得到全部的数据,才发现使用的方法不对.