dwr整合spring 收藏
dwr整合spring时,出现以下异常。
throw 'allowScriptTagRemoting is false.';
//#DWR-INSERT
//#DWR-REPLY
dwr.engine.remote.handleException("2","0",{javaClassName:"java.lang.Throwable",message:"Error"});
java.lang.IllegalArgumentException: object is not an instance of declaring class
google了一下,找到了相关做法。
dwr整合spring,我用的是dwr3rc1和spring2.5,当初整合时是查看了相关的图书《基于J2EE的Ajax宝典》和《DWR实战》。
图书介绍的整合方式是在dwr.xml 文件中加入
<allow>
...
<create creator="spring" javascript="Fred">
<param name="beanName" value="Shiela"/>
</create>
...
</allow>
运行后,发行firebug响应出现
throw 'allowScriptTagRemoting is false.';
//#DWR-INSERT
//#DWR-REPLY
dwr.engine.remote.handleException("2","0",{javaClassName:"java.lang.Throwable",message:"Error"});
后台报出
java.lang.IllegalArgumentException: object is not an instance of declaring class
重新查看DWR官网的文档,发现DWR整合spring已经有很大改动。重新按照官网的整合方式整合。
图书中介绍的整合方式已经过时,如果按照图书中的整合方式整合可能出现上述异常。
并且在对于如果dwr调用了使用了AOP的spring bean,应该加上<aop:scoped-proxy/>
例如
<bean id="B" class="com.bjinfotech.spring.practice.service.NoteServiceImpl">
<aop:scoped-proxy/> <!-- This is needed or DWR gets confused. -->
<dwr:remote javascript="noteRemoteService">
<dwr:include method="addNote" />
</dwr:remote>
<property name="noteDao" ref="noteDao" />
</bean>
dwr调用了使用了AOP的spring bean B,实际上是调用了spring bean B的代理类而不是B本身,
所以报出java.lang.IllegalArgumentException: object is not an instance of declaring class。加上
<aop:scoped-proxy/> ,根据官网手册2.0.5版3.4的解释,类似的
当DWR调用了一个使用B对象的方法时,实际调用的是代理对象的方法。
随后代理对象会从容器中获取真正的B对象,并将方法调用委派给获取到
的实际的B对象。这样DWR就得到了B对象,而不是B对象的代理,就不会报出
java.lang.IllegalArgumentException: object is not an instance of declaring class
(对象不是声明类的实例异常)。
经验教训:
1.使用新框架时,最好查看官网的最新文档,图书比较容易过时。
图书上的做法如果过时之后,容易出错。
2.使用框架时,要调试成debug模式,这次使用DWR时 ,没有一开始调成debug模式,
结果控制台不报如何异常,非常难找是哪里出错了。
搜索相关做法来源:
1.http://www.iteye.com/topic/409548
2.http://forum.springsource.org/showthread.php?t=57584
3.DWR官网的文档
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jianw2007/archive/2009/07/30/4394244.aspx