dwr调用的方法不按照js代码执行的先后顺序序执行怎么办?

博客分类:
使用DWR开始开发项目到现在,感觉真的经历了一段很长的路,因为其间遇到了很多的问题需要解决,一点儿不顺利。这个过程差不多总是这样的:写一小段程序,一运行就出错了,是什么原因呢,看了半天错误提示,不明白。怎么办,到DWR官方网站去看看吧,也许可以解决问题。如果不能,就把错误提示粘到百度去搜索一下国内网站吧。如果还不能,就到谷歌里去搜索一下国外网站。如果这些都不行,只能用最土的办法,设断点跟源码了。可以说DWR是我所用过的目前资料最少的一个框架,也是自身问题最多的一个框架。我所遇到过的很多问题都是通过跟踪源码的方式才发现和解决问题的。现在我就把发现到并解决的问题跟大家共享一下吧。当然它们中的有些问题不一定就是DWR的事,也有hibernate的问题。
一、转换一对多值对象出现的问题
我在《》一文中提到,我们应当把在dwr中用到的所有值对象都注册到dwr.xml配置文件中。在配置值对象的时候,有2种方式:使用model.*这种通配符的方式一次性将多个值对象进行注册;使用hibernate3或hibernate2的方式一个一个注册值对象。同时我也提到,使用第一种方式注册虽然简便,但存在不利于编写前端页面和性能差的问题,不推荐使用;使用第二种方式注册有利于程序的编写和性能的提高,但在dwr中存在bug。这样的bug是什么呢?我们不妨举一个实例来说明。假如在项目中存在部门和员工的值对象,并且是一对多的关系(每一个员工都只能在一个部门,但多个员工可以在用一个部门),那么hibernate在查询员工的时候会返回一个员工值对象的集合,集合中的每一个员工值对象都有一个部门属性,对应一个部门值对象,但多个员工值对象对应的可能是一个部门值对象。这个关系很清晰,也应该没有什么疑问,但在dwr将其转换为js中的对象的过程中却会发生错误。错误的提示是这样的:
org.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
仔细查看和跟踪源码,我发现这个问题出在AbstractOutboundVariable类的getReferenceVariable方法中,它的源码是这样写的:
public OutboundVariable getReferenceVariable()
if (reference == null)
reference = new ReferenceOutboundVariable(getVariableName());
if (forcedInlineStatus)
throw new IllegalStateException("Ignoring request to inline on reference for: " + this);
setInline(false);
当dwr已经使用了某个对象以后,就会将它的forcedInlineStatue置为true,当dwr再次装载这个对象的时候就会强制抛出IllegalStateException异常。这在通常情况下是没有问题的,但在我们前面提到的例子中就有问题了。当dwr转换员工值对象集合的时候,首先装载和转换了员工甲,他因为是“研发1部”所以dwr也装载了“研发1部”这个部门值对象。然后dwr开始装载和转换员工乙。由于员工乙也是“研发1部”,因此dwr又开始装载“研发1部”这个值对象,但突然发现这个值对象已经装载过了,因而就抛出了以上错误。如果我们希望整合dwr、spring、hibernate到一起进行项目开发,以上这个问题是怎么也不能避免的,问题是如何解决。非常遗憾的是,dwr官方似乎还没有要解决这个问题的意思,我思索再三以后决定,还是“自己动手丰衣足食”吧。解决的办法其实很简单,就是把11行这个强制抛出异常注释掉,然后重新编译。这样修改以后就再也没有出现以上问题,同时至今也没有发现其它问题出现。
二、转换一对一值对象出现的问题
这个问题我同样在《》一文中提到过,就是dwr在转换一对一值对象关系时出现死循环的问题。假如Employee值对象存在一个且最多一个Address值对象的时候,Employee有一个Address属性指向一个Address值对象,而Address值对象也同样会有一个Employee属性指向这个Employee值对象。我们知道hibernate对于一对一关联是不进行延迟加载的,所以dwr在装载和转换Employee值对象的时候会去加载它的Address值对象,然后在加载这个Address值对象的时候会又去加载那个Employee值对象。如此反复加载就形成了死循环。解决这个问题的办法就是在dwr.xml配置Address的时候,使用exclude禁用它对Employee的加载。详细说明见《》,这里就不再罗嗦了。
三、找不到值对象中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/LazyI
at com.htxx.demo.model.Department$$EnhancerByCGLIB$$f4b4f445.getHibernateLazyInitializer()
at org.directwebremoting.hibernate.H3BeanConverter.getClass(H3BeanConverter.java:139)
之所以说这个异常比较离谱,是因为它似乎就没有dwr什么事。事实上它也是没有dwr什么事,而是hibernate出错了。查看hibernate的官方网站你可以发现这个bug的发布,并在hibernate3.2.0.rc4以后的版本这解决这个问题了。将hibernate3换成最新版本后果然就解决这个问题了。
五、执行查询时找不到hibernate查询工厂类的问题
这个还是hibernate3的问题。在执行查询的时候在控制台显示这样一个错误:
CharS panic: ClassNotFoundException: org.hibernate.hql.ast.HqlToken
遇到这个问题不要怕,其实解决的方法很简单,就是在spring的配置文件ApplicationContext-hibernate.xml中,在sessionFactory的hibernateProperties属性中增加这样一段话:
name="hibernateProperties"
key="hibernate.query.factory_class"org.hibernate.hql.classic.ClassicQueryTranslatorFactory
六、在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包,只是在发生错误时才删除。
浏览 21875
论坛回复 /
(43 / 26458)
这个框架道路漫长,还有多表查询、更复杂的查询可能都是要面临的问题。
当然,使用数据库的视图可以解决,但是总觉得不灵活。
呵呵,还是你对hibernate理解的问题吧。为什么这么说呢?我从多表查询和复杂查询分别来分析吧。
过去我的朋友费了很多的力气去实现一个可以支持多表查询的通用查询框架,然而得到的结果是非常复杂的实现过程,最终的结果也不理想。分析原因,hibernate本身在进行多表查询的时候,整个过程就比较复杂且难于通用。实际上hibernate也不建议我们使用多表查询。从另一个角度来说,hibernate中对值对象的各种关系(一对多、多对一、一对一、多对多、3种继承)的处理已经可以实现各种多表查询需要实现的功能,因而实现多表的通用查询已经变得没有意义,只要实现建立在值对象关系上的单表查询就可以了。
也有朋友问我如何在hibernate下实现复杂的查询,我笑了,因为这并不是hiberate非常善于的领域。因为复杂查询往往会采用某种数据库特有的查询语句,或者使用大量特殊的函数,执行一些特殊的处理。虽然这些hibernate似乎可以处理,但如果你真正这样做了,你会发现不管是执行效率和易编程方面都不让人满意。所以我的建议,使用复杂查询最好不要使用hibernate。
对于问题一:
能否将一对多关联再Dao层封装好,业务层调用的是完整的list集合,javabean设计为既包括人的属性,也包括部门属性。
对于DWR来说,只知道一个javabean就可以了。
问题不是得到圆满解决了!
也许crabboy没有弄明白我提出的这个问题。正如你所说的,在设计的时候,将一对多关联在Dao层封装好,业务层调用的是完整的list集合,javabean设计为既包括人的属性,也包括部门属性。但是,dwr.xml的不同配置可以影响该问题的出现与不出现。如果dwr.xml将值对象配置为这样:
&convert match="com.htxx.demo.model.*" converter="bean"&&/convert&
这个问题就不会出现,因为最初dwr.xml的版本就是这样配置的,方案非常成熟,没有问题,但hibernate的许多优秀特性都不能体现出来,效率也是一个问题。
如果dwr.xml将值对象只这样配置:
&convert match="com.htxx.demo.model.Employee" javascript="Employee" converter="hibernate3"&&/convert&
这应当是dwr新增的功能,它能充分体现出hibernate的许多优秀特性,比如延迟加载,但还是不成熟的,存在我提到的问题,不信你可以试一试。
kaki 写道2189735 [ExecuteThread: '14' for queue: 'weblogic.kernel.Default'] WARN
org.directwebremoting.dwrp.BaseCallMarshaller
- Marshalling exception
org.directwebremoting.extend.MarshallException: Error marshalling java.lang.Object: No converter found for 'class java.lang.Object'. See the logs for more details.
at org.directwebremoting.dwrp.DefaultConverterManager.convertInbound(DefaultConverterManager.java:147)
at org.directwebremoting.convert.ArrayConverter.convertInbound(ArrayConverter.java:93)
at org.directwebremoting.dwrp.DefaultConverterManager.convertInbound(DefaultConverterManager.java:159)
at org.directwebremoting.convert.BasicObjectConverter.convertInbound(BasicObjectConverter.java:139)
at org.directwebremoting.dwrp.DefaultConverterManager.convertInbound(DefaultConverterManager.java:159)
at org.directwebremoting.dwrp.BaseCallMarshaller.marshallInbound(BaseCallMarshaller.java:152)
at org.directwebremoting.servlet.PlainCallHandler.handle(PlainCallHandler.java:44)
at org.directwebremoting.servlet.UrlProcessor.handle(UrlProcessor.java:101)
at org.directwebremoting.servlet.DwrServlet.doPost(DwrServlet.java:120)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(ServletStubImpl.java:1006)
at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:419)
at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:28)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:27)
at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:174)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:27)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:6724)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:3764)
at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2644)
at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:219)
at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:178)
2189750 [ExecuteThread: '14' for queue: 'weblogic.kernel.Default'] WARN
org.directwebremoting.dwrp.BaseCallMarshaller
- --Erroring: batchId[5] message[org.directwebremoting.extend.MarshallException: Error marshalling java.lang.Object: No converter found for 'class java.lang.Object'. See the logs for more details.]
这是设计dwr常见的问题,原因是使用了Object作为函数参数,或者在dwr中转换的对象包含类型为Object的属性。前一个问题的解决方法是不要使用这样的参数,所有的参数都是某个具体类型并在dwr中注册。后一个问题的解决方法就是在dwr.xml中禁用该属性。
用的还是您的框架,问题发生的环节是在翻页的时候。
有些奇怪。
浏览: 703389 次
来自: 北京
浏览量:30051
浏览量:53591
浏览量:321483
浏览量:61093
非常感谢楼主的分享,受益匪浅!我是一位从业务规划和运营转需求分 ...
感谢楼主的辛苦输出,半天看完了整个系列。对于一个转从开发转需求 ...
非常感谢楼主,用了大半天的时间,一口气读完了需求分析阶段。好多 ...
做了一些开发,看了楼主的文章,我深有感触,为自己的做法找到了理 ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'#!/usr/bin/python
import time
start_command="sh start-etl.sh "
es_mac_confPath
="../conf/wifi_Solr/solrToES_mac.properties"
es_identity_confPath
="../conf/wifi_Solr/solrToES_identity.properties"
task1 = start_command + es_mac_confPath
task2 = start_command + es_identity_confPath
os.popen(task1).read()
os.popen(task2).read()
阅读(...) 评论()调用dwr方法时常弹出
Invalid reply from server的错误提示
再适用dwr方方法校验数据时页面经常弹出 ‘Invalid reply from server’的错误提示,
看了下 enging.js 此提示出处如下:
&&&&& // This should get us out of 404s etc. &&&&& if (reply.search("DWREngine._handle") == -1) { &&&&&&& DWREngine._handleMetaDataError(null, "Invalid reply from server"); &&&&&&& &&&&& }
&想请假下高手这个错误是什么引发的在什么情况下会产生(会话过期?网络问题?)
谢谢了!!
可能是传输的数据格式不对
--- 共有 2 条评论 ---
你看看数据类型对不对嘛
调的都是同一个方法。能否稍微说详细些呢?
谢谢了。。
可能是没配好已解决问题
DWR 如何实现在JAVA里调用javascript 里的方法?
DWR 如何实现在JAVA里调用javascript 里的方法?在java 里去调用这个方法。function a(){& alert(&This a()!&);}
浏览次数:254
用手机阿里扫一扫
最满意答案
web.xml中配置DWR&&&&&servlet&&&&&&&&&&servlet-name&dwr-invoker&/servlet-name&&&&&&&&&&servlet-class&&&&&&&&&&&&&org.directwebremoting.spring.DwrSpringServlet&&&&&&&&&/servlet-class&&&&&&&&&&init-param&&&&&&&&&&&&&&description&调试DWR,发布系统时应将其设为false&/description&&&&&&&&&&&&&&param-name&debug&/param-name&&&&&&&&&&&&&&param-value&true&/param-value&&&&&&&&&&/init-param&&&&&&&&&[color=red]&init-param&&&&&&&&&&&&&&description&使用服务器推技术(反转AJAX)&/description&&&&&&&&&&&&&&param-name&activeReverseAjaxEnabled&/param-name&&&&&&&&&&&&&&param-value&true&/param-value&&&&&&&&&&/init-param&[/color]&&&&&&&&&init-param&&&&&&&&&&&&&&param-name&&&&&&&&&&&&&&&&&initApplicationScopeCreatorsAtStartup&&&&&&&&&&&&&/param-name&&&&&&&&&&&&&&param-value&true&/param-value&&&&&&&&&&/init-param&&&&&&&&&&init-param&&&&&&&&&&&&&&param-name&maxWaitAfterWrite&/param-name&&&&&&&&&&&&&&param-value&-1&/param-value&&&&&&&&&&/init-param&&&&&&&&&&load-on-startup&3&/load-on-startup&&&&&&/servlet&&&&&&servlet-mapping&&&&&&&&&&servlet-name&dwr-invoker&/servlet-name&&&&&&&&&&url-pattern&/dwr/*&/url-pattern&&&&&&/servlet-mapping&在页面中//激活反射ajaxdwr.engine.setActiveReverseAjax(true);在这种情况下才可以在代码里call页面的javascript下面是DWR3.0RC中操作的相关代码Browser.withCurrentPage(newRunnable(){&&&&&&&&&&&&publicvoidrun(){&&&&&&&&&&&&&&&&ScriptSessions.addFunctionCall(&onlineUser&,onlineUsers);//参数一是页面的javascript函数,参数二是函数的参数&&&&&&&&&&&&}&&&&&&&&});页面里的onlineUser:/**&&&&&&&&&&&&更新在线用户列表&&&&&&&&*/&&&&&&&&functiononlineUser(onlineUsers){&&&&&&&&&&&&if(onlineUsers){&&&&&&&&&&&&&&&&$(&#onlineUser&).empty();&&&&&&&&&&&&&&&&$(onlineUsers).each(function(i,user){&&&&&&&&&&&&&&&&&&&&$(&#onlineUser&).append(&&tr&&tdondblclick=\&openMessageDialog();\&&&+user.userName+&&/td&&/tr&&);&&&&&&&&&&&&&&&&});&&&&&&&&&&&&}&&&&&&&&}
答案创立者
以企业身份回答&
正在进行的活动
生意经不允许发广告,违者直接删除
复制问题或回答,一经发现,拉黑7天
快速解决你的电商难题
店铺优化排查提升2倍流量
擅长&nbsp 店铺优化
您可能有同感的问题
扫一扫用手机阿里看生意经
问题排行榜
当前问题的答案已经被保护,只有知县(三级)以上的用户可以编辑!写下您的建议,管理员会及时与您联络!
server is okdwr框架结合Spring框架不能调用DAO方法 - ITeye问答
想用dwr框架做一个不刷新页面,验证用户名存不存在的方法,但是页面始终无法实现方法,后台不报错,只是在JSP页面上弹出ERROR错误。
后台已经测试,可以正确进入对应方法CheckData,并且email也传入进去了,但就是不能调用userBiz方法。
怀疑跟Spring框架结合有错误,两次查询了Spring配置,都是正确的,请问何解?
下面贴jsp相关代码:
/*邮箱名是否注册检查*/
function checkResult1(){
var result=
var email = document.getElementById('email').
if(email &= 5){
result='&span class="STYLE7"&用户名必须大于5个字符&/span&';
document.getElementById('result1').innerHTML=
}else if(email & 50){
result='&span class="STYLE7"&用户名必须小于50个字符&/span&';
document.getElementById('result1').innerHTML=
CheckOccupied.checkEmailOccupied(email,msg1);
function msg1(data){
var result =
if(data == "yes"){
result='&img src="../images/check_right.gif" alt=""&';
}else if(data == "no"){
result='&span class="STYLE7"&该用户名已注册,请更换用户名或&a href="#"&登录&/a&&/span&';
result='数据错误';
document.getElementById('result1').innerHTML=
spring框架相关代码:
&!-- 声明事务管理器 --&
&bean id="myHibTransactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager"&
&property name="sessionFactory" ref="sessionFactory"&&/property&
&!-- 基于@Transactional注解方式的事务管理 --&
&tx:annotation-driven transaction-manager="myHibTransactionManager" /&
&!-- 定义事务通知 --&
&tx:advice id="txAdvice" transaction-manager="myHibTransactionManager"&
&!-- 指定事务传播规则 --&
&tx:attributes&
&!-- 对get打头的方法应用SUPPORTS事务规则 --&
&tx:method name="get*" propagation="SUPPORTS" /&
&!-- 对其他方法应用REQUIRED事务规则 --&
&tx:method name="*" propagation="REQUIRED"&&/tx:method&
&/tx:attributes&
&/tx:advice&
&!-- 定义切面,并将事务通知和切面组合(定义哪些方法应用事务规则) --&
&aop:config&
&!-- 对com.tyyf.biz包下的所有类的所有方法都应用事务规则 --&
&aop:pointcut id="bizMethods" expression="execution(* com.tyyf.biz.*.*(..))" /&
&!-- 将事务通知和切面组合 --&
&aop:advisor advice-ref="txAdvice" pointcut-ref="bizMethods" /&
&/aop:config&
&bean id="checkData" class="com.tyyf.dwr.CheckData" scope="prototype"&
&property name="userBiz" ref="userBiz" /&
java代码:
User user = new User();
// 使用UserBiz接声明属性userBiz,并添加set方法,用于依赖注入
UserBiz userB
public void setUserBiz(UserBiz userBiz) {
this.userBiz = userB
public String checkEmailOccupied(String email) {
user.setEmail(email);
if (userBiz.getUser(user) != null) {
return "no";
return "yes";
dwr配置代码:
&create creator="new" javascript="CheckOccupied"&
&param name="class" value="com.tyyf.dwr.CheckData" /&
采纳的答案
既然你是使用dwr结合spring,那你的dwr.xml怎么不用spring
&create creator="spring" javascript="CheckOccupied"&
&param name="beanName" value="checkData"/&
&include method="checkEmailOccupied"/&
另外在applicationcontext.xml定义bean
&bean id="checkData" class="com.tyyf.dwr.CheckData"/&
您那个userBiz是不是为null?
已解决问题
未解决问题

我要回帖

更多关于 js先后执行顺序 的文章

 

随机推荐