八月 05, 2015
by
徐景
问题描述:
某客户系统基于Platform6.2开发上线,近期在生产环境上打一个业务代码的epd补丁包,其中有调整过数据实体,打补丁重启Server后访问系统,和该数据实体相关的保存功能,即保存新增的数据报错。且此问题只在生产环境中有,开发环境、环境相近的测试环境都无法重现:
[KMToBeAudit:eos-default][2015-06-24 08:53:15,025][KMToBeAudit:ERROR][com.primeton.ext.engine.core.processor.AbstractPageFlowProcessor:653] error [KMToBeAudit:com.fundway.ncms.p.business.zsht.ZSHTBusinessList.flow?_flowKey=73145c19-9249-4442-8cfd-1773ac3eae96.null]so cannot convert the object to DataObject
com.primeton.ext.data.common.ValueConvertException: the object class is 'java.util.HashMap' , so cannot convert the object to DataObject.
......
解决过程如下:
1、检查业务源代码,看到点击保存功能,从页面提交到页面流会传一个数据实体类型的参数com.fundway.ncms.p.business.zsht.dataset.BizStdcont,不过,未看出代码上有什么问题,理论上代码若有问题在其他环境应该很容易重现。
2、怀疑数据实体文件中定义的字段与实际使用的有出入:
检查了生产环境中页面流、逻辑流编译后的class和java文件;JSP页面编译后的class和java文件;数据集相关文件,即以.dataset .hbm .viewmodel .xsd四个文件名结尾的文件,未发现有此问题。
3、怀疑数据实体实际未加载到缓存中,导致此错误。
将附件的JSP部署到业务应用war下,访问该页面,页面打印的结果是"com.fundway.ncms.p.business.zsht.dataset.BizStdcont not found",说明确实由于某种原因该数据实体未加载到缓存中。导致页面传参无法转化成相应的数据实体对象。
4、最终解决办法,仍然使用该JPS,将以下代码的注释去掉,并修改xsd的文件位置。目的是强制加载数据实体。
/**读取指定的数据实体文件,将数据实体加载到缓存中 **/
/*FileInputStream xsdInputStream = null;
try {
xsdInputStream = new FileInputStream("D:/Platform/apache-tomcat-7.0.54/webapps/default/WEB-INF/_srv/work/user/com.fundway.ncms.p.business.zsht/com/fundway/ncms/p/business/zsht/dataset.xsd");*//*需要加载的数据实体xsd文件的所在位置
DynamicXSDLoader.load(xsdInputStream, null, false);
} catch(Throwable t) {
StringWriter strWriter = new StringWriter();
t.printStackTrace(new PrintWriter(strWriter));
out.println("
" + strWriter.toString() + "");
} finally {
if (xsdInputStream != null) {
xsdInputStream.close();
}
}*/