这几天想在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类封装
@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代码
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。这个标签蛮不多的,特别是支持分页,我很喜欢,(不用写复杂的数据操作啦)
<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!这次成功了,真的是数据存储不一致的问题!终于忙活了一个早上。把问题解决了。
经过这次的教训,以后遇到这类问题的话,就比较有底了,实体改变,必然带来数据区的改变,我居然连这点都没想到,
哈哈,还太菜了, 要努力啊
分享到:
相关推荐
连接字符串(Connection String)是一种用于指定数据源和连接属性的文本格式。它由一系列键值对组成,每个键值对之间通过分号分隔。对于Access数据库而言,连接字符串通常包含以下几个关键部分: 1. **Provider**:...
通过行关键字row key、列关键字column key、时间戳time stamp(区分不同数据版本/按最近几个版本、按最近几天的版本)索引数据,Bigtable不对数据进行处理,一律看作字符串,存储逻辑为(row:string,column:...
《Google Python 编码风格指南中译版》是Google针对Python编程制定...对于Google App Engine的开发者,还需要注意其对线程和高级特性的特殊限制。总的来说,Google的Python编码风格指南是Python开发者的一个宝贵资源。
- **Google App Engine**:同样地,Guava也可以在Google App Engine上使用,但需要进一步验证。 - **GWT(Google Web Toolkit)**:Guava在GWT上的支持并不全面,大约有2/3的库功能可以安全使用。 #### 性能考虑 ...
它不仅提供基本的IDE功能,如调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单元测试和版本控制等,还提供了专门针对Django框架开发的便捷功能,并且支持Google App Engine。 编写Python程序时,通常从...
在这个例子中,我们创建了一个Engine对象,定义了一个名为`users`的Table模型,包含`id`、`username`和`email`三个字段。最后,调用`create_all()`方法在数据库中创建对应的表。 总之,解决Flask和SQLAlchemy在处理...
某些情况下无法在两列上同时应用索引 (例如MySQL 4之前的版本,Google App Engine的数据层等),利用geohash,只需在一列上应用索引即可。 其次,geohash表示的并不是一个点,而是一个矩形区域。比如编码wx4g0ec19...
qbg可以为appengine数据存储区生成类型安全包装器。 如果您使用字符串文字进行查询,则在输入错误时会s脚。 qbg生成Appengine数据存储包装程序代码。 这是类型安全的。 您的错误将被go编译器发现。 type User ...
.getText(R.string.app_versionName).toString(); return verName; } ``` 升级流程通常包含以下几个步骤: 1. **版本检查**:客户端需要定期向服务器请求最新版本的信息。这可以通过调用一个HTTP接口或者读取...
在App.config文件中添加一个加密的connectionStrings节: ```xml , System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> <!-- Encrypted connection ...
- **功能**:查找一个字符串在另一个字符串中的位置。 - **参数**: - pattern:要查找的字符串。 - expression:源字符串。 - **示例**: ```sql SELECT CHARINDEX('c', 'abcdef') AS CharIndexResult; ```...
这段代码将读取每个段落,并将它们合并成一个字符串。 ### 2. 图片提取 提取Word文档中的图片,我们需要使用`InlineShapes`集合。每个`InlineShape`对象代表一个图形或图像。以下代码可以获取文档中的所有图片并...
Velocity Template,作为Apache开源组织提供的一个Java模板引擎,最初被设计用于Web开发中的视图层,帮助开发者将静态页面与动态数据分离。然而,它的应用并不仅限于此,正如标题所示,“Velocity Template的另类...
在Android平台上,文本朗读(Text-to-Speech, TTS)是一项重要的辅助功能,它允许应用程序将文字转化为语音,尤其适用于阅读障碍者...通过实践这个项目,学生可以提升对Android平台的理解,同时增强解决问题的能力。
然后,我们编写Java类`Hello`,它包含一个名为`hello`的方法,接收两个字符串参数并返回它们拼接后的字符串。这个方法在服务器端执行,并可以通过DWR被客户端JavaScript调用。 ```java package com.accp.util; ...
在C#中与SQL Server 2005建立连接是一个常见的任务,特别是在开发基于.NET Framework的应用程序时。本文将详细讲解如何配置SQL Server 2005以允许远程连接,并介绍几种不同的数据库连接字符串格式。 首先,让我们...
在Python web开发中,Flask是一个轻量级的Web服务程序框架,而MySQL是一种广泛使用的开源关系型数据库管理系统。本示例将介绍如何在Flask框架中操作MySQL数据库,包括数据库连接、表格创建、数据的增删改查等基本...
虽然Python支持多线程编程,但在Google App Engine环境中,由于其限制,线程的使用并不推荐。应当寻找其他替代方案,如异步IO或任务队列,以避免因环境限制导致的问题。 ##### 1.1.19 高级特性 Python提供了一些...
Java SE(标准版)是Java开发平台的核心,用于构建桌面应用程序和服务器端应用程序。...同时,这些知识也适用于其他使用Java语言的领域,如大数据处理(Hadoop、Spark)和云计算平台(如Google的App Engine)。