没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
翻译|其它|编辑:郝浩|2007-09-26 09:24:22.000|阅读 2275 次
概述:
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
使用 DWR 开始开发项目到现在,感觉真的经历了一段很长的路,因为其间遇到了很多的问题需要解决,一点儿不顺利。这个过程差不多总是这样的:写一小段程序,一运行就出错了,是什么原因呢,看了半天错误提示,不明白。怎么办,到 DWR 官方网站去看看吧,也许可以解决问题。如果不能,就把错误提示粘到百度去搜索一下国内网站吧。如果还不能,就到谷歌里去搜索一下国外网站。如果这些都不行,只能用最土的办法,设断点跟源码了。可以说 DWR 是我所用过的目前资料最少的一个框架,也是自身问题最多的一个框架。我所遇到过的很多问题都是通过跟踪源码的方式才发现和解决问题的。现在我就把发现到并解决的问题跟大家共享一下吧。当然它们中的有些问题不一定就是 DWR 的事,也有 hibernate 的问题。
一、 转换一对多值对象出现的问题
我在《DWR 帮助文档-dwr.xml 文件的配置》一文中提到,我们应当把在 dwr 中用到的所有值对象都注册到 dwr.xml 配置文件中。在配置值对象的时候,有2种方式:使用 model.*这种通配符的方式一次性将多个值对象进行注册;使用 hibernate3或 hibernate2的方式一个一个注册值对象。同时我也提到,使用第一种方式注册虽然简便,但存在不利于编写前端页面和性能差的问题,不推荐使用;使用第二种方式注册有利于程序的编写和性能的提高,但在 dwr 中存在 bug。这样的 bug 是什么呢?我们不妨举一个实例来说明。假如在项目中存在部门和员工的值对象,并且是一对多的关系(每一个员工都只能在一个部门,但多个员工可以在用一个部门),那么 hibernate 在查询员工的时候会返回一个员工值对象的集合,集合中的每一个员工值对象都有一个部门属性,对应一个部门值对象,但多个员工值对象对应的可能是一个部门值对象。这个关系很清晰,也应该没有什么疑问,但在 dwr 将其转换为 js 中的对象的过程中却会发生错误。错误的提示是这样的:
directwebremoting.extend.MarshallException: Error marshalling com.htxx.demo.model.Employee: Ignoring request to inline on reference for: Object:s0:{departmentId=Simple:"001", departmentName=Simple:"\u4EBA\u529B\u8D44\u6E90\u90E8", employees=Simple:null}. See the logs for more details.
at org.directwebremoting.convert.BasicObjectConverter.convertOutbound(BasicObjectConverter.java:200)
at org.directwebremoting.dwrp.DefaultConverterManager.convertOutbound(DefaultConverterManager.java:192)
...
Caused by: java.lang.IllegalStateException: Ignoring request to inline on reference for: Object:s0:{departmentId=Simple:"001", departmentName=Simple:"\u4EBA\u529B\u8D44\u6E90\u90E8", employees=Simple:null}
at org.directwebremoting.dwrp.AbstractOutboundVariable.getReferenceVariable(AbstractOutboundVariable.java:148)
at org.directwebremoting.dwrp.DefaultConverterManager.convertOutbound(DefaultConverterManager.java:181)
at org.directwebremoting.convert.BasicObjectConverter.convertOutbound(BasicObjectConverter.java:189)
... 28 more
org.
仔细查看和跟踪源码,我发现这个问题出在 AbstractOutboundVariable 类的getReferenceVariable 方法中,它的源码是这样写的:
java 代码
/* (non-Javadoc)
* @see org.directwebremoting.OutboundVariable#getReference()
*/
public OutboundVariable getReferenceVariable()
{
if (reference == null)
{
reference = new ReferenceOutboundVariable(getVariableName());
if (forcedInlineStatus)
{
throw new IllegalStateException("Ignoring request to inline on reference for: " + this);
}
else
{
setInline(false);
}
}
return reference;
}
当 dwr 已经使用了某个对象以后,就会将它的 forcedInlineStatue 置为 true,当 dwr 再次装载这个对象的时候就会强制抛出 IllegalStateException 异常。这在通常情况下是没有问题的,但在我们前面提到的例子中就有问题了。当 dwr 转换员工值对象集合的时候,首先装载和转换了员工甲,他因为是“研发1部”所以 dwr 也装载了“研发1部”这个部门值对象。然后 dwr 开始装载和转换员工乙。由于员工乙也是“研发1部”,因此 dwr 又开始装载“研发1部”这个值对象,但突然发现这个值对象已经装载过了,因而就抛出了以上错误。
如果我们希望整合 dwr、spring、hibernate 到一起进行项目开发,以上这个问题是怎么也不能避免的,问题是如何解决。非常遗憾的是,dwr 官方似乎还没有要解决这个问题的意思,我思索再三以后决定,还是“自己动手丰衣足食”吧。解决的办法其实很简单,就是把11行这个强制抛出异常注释掉,然后重新编译。这样修改以后就再也没有出现以上问题,同时至今也没有发现其它问题出现。
二、转换一对一值对象出现的问题
这个问题我同样在《DWR 帮助文档-dwr.xml 文件的配置》一文中提到过,就是 dwr 在转换一对一值对象关系时出现死循环的问题。假如 Employee 值对象存在一个且最多一个 Address 值对象的时候,Employee 有一个 Address 属性指向一个 Address 值对象,而 Address 值对象也同样会有一个 Employee 属性指向这个 Employee 值对象。我们知道 hibernate 对于一对一关联是不进行延迟加载的,所以 dwr 在装载和转换 Employee 值对象的时候会去加载它的 Address 值对象,然后在加载这个 Address 值对象的时候会又去加载那个 Employee 值对象。如此反复加载就形成了死循环。解决这个问题的办法就是在 dwr.xml 配置 Address 的时候,使用 exclude 禁用它对 Employee 的加载。详细说明见《DWR 帮助文档-dwr.xml 文件的配置》,这里就不再罗嗦了。
三、找不到值对象中 set 函数的问题
在使用dwr执行插入和更新操作的时候,有时会出现以下的警告:
Missing java bean property to match javascript property:[属性名]. For causes see debug level logs:
如果将log4j中dwr的级别降低为DEBUG级别,你还可以在控制台中看到一下提示:
You may be missing the correct setter: setXXX()
The property may be excluded using include or exclude rules.
其实你并没有在 dwr 中禁用这个属性,同时也正确地在值对象中编写了一个 setXXX()方法的,这个问题到底出在哪里呢?我查看了 dwr 的源码发现,dwr 是如何获得一个值对象的所有属性及其各自的 get 和 set 方法呢?是采用 Java 的反向机制。如果你通过自己去编写或修改某个属性及其它的 get 和 set 方法,而不是通过工具生成,那么反向机制就可能找不到这个属性的 get 和 set 方法(注意,是可能而并不总是这样)。这个问题解决的办法就是删除该属性的 get 和 set 方法,然后使用 MyEclipse 的 get 和 set 方法生成工具自动生成。
四、找不到值对象的 LazyInitializer 的问题
在使用 dwr 执行插入和更新操作的时候,有时会抛出这样一个离谱的异常:
java.lang.
NoSuchMethodError: com.htxx.demo.model.Department.getHibernateLazyInitializer()Lorg/hibernate/proxy/LazyInitializer;
at com.htxx.demo.model.Department$$EnhancerByCGLIB$$f4b
at org.directwebremoting.hibernate.H3BeanConverter.getClass(H3BeanConverter.java:139)
之所以说这个异常比较离谱,是因为它似乎就没有 dwr 什么事。事实上它也是没有 dwr 什么事,而是 hibernate 出错了。查看 hibernate 的官方网站你可以发现这个 bug 的发布,并在 hibernate
五、执行查询时找不到 hibernate 查询工厂类的问题
这个还是 hibernate3的问题。在执行查询的时候在控制台显示这样一个错误:
CharScanner; panic: ClassNotFoundException: org.hibernate.hql.ast.HqlToken
遇到这个问题不要怕,其实解决的方法很简单,就是在 spring 的配置文件ApplicationContext-hibernate.xml 中,在 sessionFactory 的 hibernateProperties 属性中增加这样一段话:
xml 代码
<property name="hibernateProperties">
<props>
...
<prop key="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactoryprop>
props>
property
六、在 JDK1.4中运行和部署 DWR2和 hibernate3出现的问题
在 DWR2.0中提供了一些 JDK5中才能使用的 annotations 的功能。然而,这个功能在 JDK1.4的环境中进行启动或者部署会发生错误。抱歉的是这个错误信息我没有及时记录,日后补上。这个错误在网上可以轻易地搜索到解决方案,即在 dwr.jar 中删除掉 org.directwebremoting.annotations.AnnotationsConfigurator 这个类再重新部署就可以了。
同样的问题出现在 hibernate3中,hibernate3 对 annotations 的支持在 JDK1.4中也可能出现异常,解决的办法就是在部署文件中删除掉 hibernate-annotations.jar 就可以了。
另外值得说明的是,以上2个问题并不是每次都会出现的。它们就如同幽灵一样有时出现有时不出现,因此我们并不需要总是删除这个类和 jar 包,只是在发生错误时才删除。
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com
文章转载自:JavaEye接DevExpress原厂商通知,将于近日上调旗下产品授权价格,现在下单客户可享受优惠报价!
面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@evget.com
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
慧都科技 版权所有 Copyright 2003-
2025 渝ICP备12000582号-13 渝公网安备
50010702500608号