1.BLOB查询时遇到异常:
testSaveOrUpdateOrList(net.kofsky.nmis.po.TestPO.TestMerchandisePO)
org.springframework.orm.hibernate3.HibernateJdbcException: JDBC exception on Hibernate data access; nested exception is org.hibernate.exception.GenericJDBCException:
could not initialize a collection: [net.kofsky.nmis.po.Merchandise.merImage#11]
Caused by: java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Unsupported data conversion.
网上查阅得知微软提供的JDBC驱动bug甚多,并且不支持BLOB的部分操作
解决方案:将MS驱动换为:jtds-1.2.1.jar,重新配置数据源,Ok
2.Spring+Hibernate分页查询
List tempList = hibernateTemplate.executeFind(new HibernateCallback() {
public Object doInHibernate(Session session) {
Query query = session.createQuery(hql);
query.setFirstResult(start);
query.setMaxResults(pageSize);
List list = query.list();
return list;
}
});
3.聚合查询问题
比如查询某个表单的所有记录,直接用SQL或者HQL都很简单,但用Spring+Hibernate却又麻烦一些
方法一:采用spring的回调方式
final String tempHql = "select count(*) from " + PO;
List record = hibernateTemplate
.executeFind(new HibernateCallback() {
public Object doInHibernate(Session session) {
Query query = session.createQuery(tempHql);
List list = query.list();
return list;
}
});
int recordCount=((Long)record.get(0)).intValue();//获取数值
方法二:
String tempHql = "select count(*) from " + PO;
int recordCount=((Long)hibernateTemplate.find(tempHql).iterator().next()).intValue();
4.Spring异常处理
做了了三个简单的测试页面: 登录页面login.jsp, 登录成功页面index.jsp,失败页面error.jsp,配置一个登录控制器;调试过程中,一直由页面login.jsp跳入error.jsp,一直如此,没有任何异常和错误提示,用System.out.print跟踪到数据库操作代码的中间,然后中止了,不返回任何数据。找了半天错误,原来发现配置了Spring的异常处理:
<bean id="exceptionResolver"
class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="defaultErrorView">
<value>error</value>
</property>
<property name="exceptionMappings">
<props>
<prop key="java.sql.SQLException">error</prop>
<prop key="java.lang.RuntimeException">error</prop>
</props>
</property>
</bean>
在后台处理过程发生异常后,直接跳入了配置的error.jsp页面,因此不会输出任何异常。在调试时需要把这段去掉,跟踪可能出现的问题,待发布时再加入异常处理页面。
这个问题也说明了单元测试的重要性,如果后台的操作全部经过了比较详尽的单元测试,那么出现这类问题的可能性就很小了。~~
5.插播一个:C++的临时指针问题
FeatureGroup<featureType,resultType>* temp;//临时指针,用于遍历向量内数据
for ( ; sIter != eIter; sIter++ )
{ //operation based temp
}
循环内操作完毕以后,对临时指针不作任何处理。一般来讲是没啥问题了,只是用了一个临时空间而已,也没有delete操作,不会影响到原始向量空间内的数据。
但事实并非如此,C++自动会将临时指针所指向的对象销毁,这样问题就出现了,当用了这段循环遍历的代码以后,发现最后向量的最后一个数据出现了混乱,完全不合常理。
解决方案有三个:不用临时指针、将临时指针设置为全局变量、临时指针用完以后设置为NULL
杨世泉说最后一个可能有问题,但我做ISODATA时大量采用了这种方式,似乎没有问题~~
6.中文问题
依稀记得,刚开始用java作网页的时候,被其中的编码问题弄的心力交瘁。在做页面之前,我似乎已经完全忘掉了这个问题。今天,又一次被这个问题难住了。
完全让人头晕的东西,页面编码格式,内存中编码格式,传输编码格式,浏览器解码格式,数据库编码格式,数据库链接编码。。。。
为了简单,我把所有涉及编码的地方都设置为gb2312,可惜,在页面提交后,到了web服务器端就出现了问题,变成乱码了。在服务器端,通过如下方法获得正常输出:
new String(s.getBytes("8859_1"), "gb2312");(网络流中一般采用8859_1传输)
可是不想每个参数都加入这么一句转换。网上查到两种解决方式:
a 在web.xml中配置Spring的编码
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>gb2312</param-value>
</init-param>
</filter>
b.在server.xml中<Connector port="8080"...>属性中加入URIEncoding="gb2312"
两种方法完全不起作用。很奇怪。将所有编码全部设成utf8,也是如此。只不过,在服务器端需要通过 new String(s.getBytes("8859_1"), "utf8")才能获得正常的参数了。
郁闷,莫非真的要每个数据要要手工转换一下?!啊
补记:解决了,web.xml加CharacterEncodingFilter时忘了加:
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
加上就可以了。
7.极品问题:找不到某些文件
jsp文件明明存在,访问服务器却显示文件不存在....用javascript读本地图像文件,文件明明在目录下面,硬是没办法加载....显出出来是一个一个的红叉叉.....这个问题俺被困扰多时,今天被一高人解决....晕惨啊.....
原因:缓存问题....Eclipse没有编译部分文件,致使tomcat无法找到文件
在工作目录下面,用工程项目的名称搜索,可以在eclipse的缓存中看到其自动编译的文件,会发现,凡是tomcat找不到的文件,这里都没有...
老夫的相对目录是..workplace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/work/Catalina/localhost/NMisSystem/org/apache/jsp/等..(在工作目录的.metadata文件夹下搜一下就可以了,有多个)
删之.....让eclipse rebuild项目.....
8.Hibernate保存数据时错误:java.lang.ClassCastException: java.sql.Timestamp
/**
* @hibernate.property column="registerTime" type="java.sql.Date" length="50"
*/
错误原因:生成映射文件的注释里面,多了个length="50",呵呵,这是只有字符串才有的参数,如果字段是Date,是不应该有的
9.数据更新的时候一定要加上隐藏字段(JSTL作页面):
<spring:bind path="command.id">
<input type="hidden" value="<c:out value="${status.value}"/>" name="<c:out value="${status.expression}"/>">
</spring:bind>
怎么老是忘了呢?!!
10.Command(就是与页面绑定的类,strtus里叫Form) 里面 字段必须小写字母打头,否则抛出:org.springframework.beans.NotReadablePropertyException: Invalid property 'EndIP' of bean class [net.kofsky.nmis.command.NetBarCommand]: Bean property 'EndIP' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?
11、log4j的配置
在非web应用环境下,只需要把log4j的包放到classpath下,然后在程序中加入private Logger log = Logger.getLogger(XXXClass.class);,然后就可以直接用log进行日志记录了~~
用Spring进行web开发,还需要在web.xml中配置
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>NMisSystem.root</param-value>
</context-param>
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/classes/log4j.properties</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
log4j比较详细的介绍可以看:http://goodluckyemin.bokee.com/2669924.html
12、在Eclipse可以运行,但在tomcat中发布项目时出现错误:org.apache.commons.logging.LogConfigurationException: org.apache.commons.logging.LogConfigurationException: No suitable Log constructor [Ljava.lang.Class;@1589d3d for org.apache.commons.logging.impl.Log4JLogger (Caused by java.lang.NoClassDefFoundError: org/apache/log4j/Category) (Caused by org.apache.commons.logging.LogConfigurationException: No suitable Log constructor [Ljava.lang.Class;@1589d3d for org.apache.commons.logging.impl.Log4JLogger (Caused by java.lang.NoClassDefFoundError: org/apache/log4j/Category))
俺的log4j包一直都放在lib下面,怎么可能找不到呢?很奇怪~~后来上网查了一下,发现包放重复了有可能出现这种错误~~一直找,在jre/lib/ext下面很多包,很多都和WEB-INF/lib下的包重复了,汗,除dnsns.jar四个原有的包外,其他全部删除,重启tomcat,ok
13、tomcat中发布项目:
a.Eclipse中导出项目为.war(或者ant打包)
b.将war文件拷贝到%TOMCAT_HOME%/webapps/下
(直接放到webapp下似乎不需要设置虚拟目录)
c.启动tomcat。。。。