因项目要求,需要给一个已有web项目增加webservice功能,于是开始学习:
首先,通过一下几个资料学习了webservice:
1. 《MyEclipse5.5三分钟实现java访问公网.net webservice》
http://www.javaeye.com/post/309478
虽然是做个客户端,但是也有参考价值,尤其是为已有web项目增加webservice支持这方面
2.《用myeclipse实现webservice(上)》
http://blog.sina.com.cn/s/reader_4cac2a2f01000bdi.html
根据这个做了个演示程序,成功,很有参考价值
3.《VB6中如何使用C#开发的WebService进行开发》
http://www.cnblogs.com/wuhuacong/archive/2007/01/29/634003.html
用vb开发webservice客户端程序,需要安装配置SOAP Toolkit ,这个文档讲的足够了,但是程序编写方法和常规的不一样,不用学他的程序
4.《SOAP Toolkit User Guide》
安装完SOAP Toolkit 后会在“程序”里找到相关快捷方式
用vb开发webservice的客户端,有这个帮助文档足够了,根据这个做了个简单的客户端
以上学习过程在独立的tomcat5.5上完成,接下来在自己的项目上按照以上学习经验增加webservice,就没那么轻松了:
遇到的问题:
报错一:java.lang.NoClassDefFoundError: org/springframework/beans/factory/support/ReaderContext
原来在tomcat上运行没有问题的程序到项目所使用的jboss4.0.3上居然报错一堆:noclassfound。看起来是找不到spring的类,查了些资料,有人说xbean-spring.jar用2.8的就可以,结果到xbean网站上只见到最新的2.6没有发现2.8,无奈,只好寻找别的方法。
在spring的cvs中查找了spring项目的早期代码,都没有发现这个类
为排除可能性,下载了别的版本的jboss单独部署演示程序没有问题,于是在项目的jboss上将项目undeploy,演示程序运行成功(期间发现jboss启动应用是按照字母排序启动的哈)
非常不解,为什么不同的war包还会互相影响
怀疑与spring版本有关:
替换项目中的spring.jar为最新的2.5.5中的jar包,无效
替换项目中的spring.jar为xfire所使用的spring1.2.6.jar,无效
替换xfire中和项目中的的spring.jar为2.5.5中的jar包,无效
无意中,在xfire的最新发布包中发现有xbean-spring2.8.jar 替换后果然不再报这个错了,却报别的错:
报错二:java.lang.IllegalArgumentException: Servlet mapping specifies an unknown servlet name SomeServletName
最后看到这个:
(http://wiki.metawerx.net/wiki/Java.lang.IllegalArgumentException)
your web.xml file has a <servlet-mapping> with no matching <servlet>. Each mapping must include a <servlet-name> that matches a <servlet-name> in a <servlet> element.
your web.xml file has a correctly matched servlet-mapping and servlet element, but the servlet-mapping appears before the servlet. The servlet-mapping must appear below the servlet, because the file is parsed in order.
在web.xml查看了一下,果然是后一种情况,调整顺序后,不报这个错了,接着报下一个错:
报错三:Unrecognized xbean element mapping: beans in namespace http://xfire.codehaus.org/config/1.0
还好一下子就找到一篇文章说这个:http://www.blogjava.net/XXNiuLang/archive/2007/08/15/136952.html
不过遗憾的是,按照这个文章做,并没有解决我的问题
但在另外一篇文章中看到(http://www.jumpingbean.co.za/blogs/mark/xfire_spring_bug):Basically XFire needs an earlier version of spring to work. I ended up using spring 1.2.8 but I assume any spring version before 2.0 would work.
将项目中的spring包替换为xfire发布包中的1.2.6,哈,成功!
今天又做了几次试验,发现自己走了一些弯路,最后总结一下:
对于我们的项目,增加webservice的步骤应该如下:
1. 在myeclipse里增加webservice的支持(会自动配置web.xml并增加相应的xfire包)
2. 修改web.xml,使
<servlet>
<servlet-name>XFireServlet</servlet-name>
<servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
出现在
<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
之前。
注:可能因为我们web.xml不够规范的原因,自动增加的maping放在了servlet前面,会导致错误。
3. 将项目中的spring.jar删除,替换为xfire使用的spring.1.2.6.jar,至此,webservice和原有项目的共存问题得到解决
4.开始为项目增加webservice类,然后调用,成功。