成功解决Google app Engine 解决String500个字符限制(原创)

本文介绍在Google App Engine上使用Struts2框架搭建个人博客的过程,重点解决使用Text类型存储长文本内容的问题及数据一致性错误。

这几天想在Google app Engine建设一个个人博客,部署好了struts2,就想用这个框架来充当mvc。

又有GAE不支持hibernate。只支持jdo和jpa实现的Date 实现的开源框架DataNuclues,就用这个来当持久层了。

现在Google app Engine for java 还不是很完善,部署struts2的框架已经花了我很多时间,想想这个项目不大,就没有加入spring了。

完成了分类和博客的增删改查,但是发布博客的时候,发现出现了一个异常

java.lang.IllegalArgumentException: content: String properties must be 500 characters or less.  Instead, use com.google.appengine.api.datastore.Text, which can store strings of any length.
意思就是string只能存储500个字节以内,替代方案就是Google提供的Text这个类,可以存储任意长度,好吧,那就替换吧
照着下面的代码 把博客的内容的get和set方法 分别用Text类封装

Java代码
  1. @Persistent   
  2. private  String content;  
  3.   
  4. @Persistent   
  5. private  Text text;  
  6.   
  7. public  String getContent() {  
  8. return  text.getValue();  
  9. }  
  10.   
  11. public   void  setContent(String content) {  
  12. text = new  Text(content);  
  13. }  
 @Persistent
private String content;

@Persistent
private Text text;

public String getContent() {
return text.getValue();
}

public void setContent(String content) {
text = new Text(content);
}


  也就是只把string当作一个跳板了,真正存储在数据存储区的是Text

话说我也认为这样做就没有问题了,但是却出现了非常大的问题,搞了我整个早上,

先看看我的action代码

Java代码
  1. public  String addBlog()  throws  Exception {  
  2.         blogDAO.addBlog(blog);  
  3.         return  listBlogs();  
  4.     }  
  5.       
  6.     public  String listBlogs()  throws  Exception {  
  7.         List<Blog> blogs = blogDAO.listBlogs();  
  8.         HttpServletRequest request = ServletActionContext.getRequest();  
  9.         request.setAttribute("blogs" , blogs);  
  10.         return  SUCCESS;  
  11.     }  
public String addBlog() throws Exception {
		blogDAO.addBlog(blog);
		return listBlogs();
	}
	
	public String listBlogs() throws Exception {
		List<Blog> blogs = blogDAO.listBlogs();
		HttpServletRequest request = ServletActionContext.getRequest();
		request.setAttribute("blogs", blogs);
		return SUCCESS;
	}

 增加完一个博客后,就转到博客列表显示的action,通过request传给展示页面,

下面是展示页面的部分代码,用来jsp的开源标签库display。这个标签蛮不多的,特别是支持分页,我很喜欢,(不用写复杂的数据操作啦)

Html代码
  1. < display:table   name = "blogs"   requestURI = "BlogAction!listBlogs"   id = "blog"   >   
  2.             < display:column   property = "id"   title = "序号" > </ display:column >   
  3.             < display:column   property = "title"   title = "标题" > </ display:column >   
  4.             < display:column   property = "category"   title = "所属分类" > </ display:column >   
  5.             < display:column   property = "content"   title = "内容" > </ display:column >   
  6.             < display:column   property = "createdDate"   title = "创建时间" > </ display:column >   
  7.             < display:column   property = "updateDate"   title = "更新时间" > </ display:column >   
  8.             < display:column   title = "操作" >   
  9.                 < a   href = "BlogAction!deleteBlog?blog.id=${blog.id }" > 删除 </ a >   
  10.                 < a   href = "BlogAction!modifyBlog?blog.id=${blog.id }" > 更新 </ a >     
  11.             </ display:column >   
  12.         </ display:table >   
<display:table name="blogs" requestURI="BlogAction!listBlogs" id="blog" >
    		<display:column property="id" title="序号"></display:column>
    		<display:column property="title" title="标题"></display:column>
    		<display:column property="category" title="所属分类"></display:column>
    		<display:column property="content" title="内容"></display:column>
    		<display:column property="createdDate" title="创建时间"></display:column>
    		<display:column property="updateDate" title="更新时间"></display:column>
    		<display:column title="操作">
    			<a href="BlogAction!deleteBlog?blog.id=${blog.id }">删除</a>
    			<a href="BlogAction!modifyBlog?blog.id=${blog.id }">更新</a>	
    		</display:column>
    	</display:table>

 name属性是传过来的属性,如果是用sessio传过来的话,就不需要要requestURI,否则就要写,id是别名。主要是在下面的url 中使用。

 

但是这样,问题出现了,抛出了一个类型转换异常。list不能转换成string?

这就让我觉得很奇怪了?到底怎么回事。我以为我的代码写错了,然后仔细了审查了,没问题啊,后来调试的时候,发现异常出现在 request.setAtribute这句中?但是我又看了我的分类管理的模块,代码几乎都是一样的,为什么那里没有出现问题,而这里出现了呢?

后来想了下, 是不是数据存储区的问题呢?我的实体类的代码是改过的,说做就做,我把数据存储器情况,然后重启应用.....OK!这次成功了,真的是数据存储不一致的 问题!终于忙活了一个早上。把问题解决了。

   经过这次的教训,以后遇到这类问题的话,就比较有底了,实体改变,必然带来数据区的改变,我居然连这点都没想到,

哈哈,还太菜了, 要努力啊

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值