成功解决Google app Engine 解决String500个字符限制(原创)
2010-01-27 11:13
495 查看
这几天想在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代码
@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代码
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代码
<
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!这次成功了,真的是数据存储不一致的
问题!终于忙活了一个早上。把问题解决了。
经过这次的教训,以后遇到这类问题的话,就比较有底了,实体改变,必然带来数据区的改变,我居然连这点都没想到,
哈哈,还太菜了, 要努力啊
又有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代码
@Persistent
private
String content;
@Persistent
private
Text text;
public
String getContent() {
return
text.getValue();
}
public
void
setContent(String content) {
text = new
Text(content);
}
@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代码
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;
}
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代码
<
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
>
<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!这次成功了,真的是数据存储不一致的
问题!终于忙活了一个早上。把问题解决了。
经过这次的教训,以后遇到这类问题的话,就比较有底了,实体改变,必然带来数据区的改变,我居然连这点都没想到,
哈哈,还太菜了, 要努力啊
相关文章推荐
- 成功解决Google app Engine 解决String500个字符限制(原创)
- 用SimpleDS解决Google AppEngine的持久层
- 初遇 Google App Engine, 更新问题的解决
- Google App Engine 中1M的限制
- 用SimpleDS解决Google AppEngine的持久层
- 初遇 Google App Engine, 更新问题的解决
- Google App Engine 是不是取消了Datastore fetch最多1000的限制
- 无法访问appengine.google.com的解决办法
- Google App Engine (Java + String + Velocity)数据访问调试,出现错误 Cannot find class [javax.naming.Context]
- Google App Engine Launcher无法启动问题解决
- Google appengine 上传输错用户名解决办法;
- GoogleAppEngineLauncher不能启动的解决方法
- ubuntu下google app engine的dev_appserver.py启动报缺失PIL module的warning的解决办法
- Google App Engine 中数据库(DataStore)的限制
- com.google.appengine.api.datastore.Text用法及解决无法显示Text字段
- Google App Engine简介及限制说明
- 解决在eclipse发布google app engine 项目时出现的java.lang.IllegalStateException: cannot find javac executable based on java.home异常
- google app engine的缓存服务解决性能问题
- 解决Google App Engine的中文乱码问题
- [Ubuntu] Linux下使用google app engine,无法打开https网站的解决方法