基于xfire实现webservice的实例

基于xfire实现webservice的实例

 

       首先下载xfirejar,并导入项目当中

       下载地址:http://xfire.codehaus.org/Download

1.     编写实现类

a.     首先建一个接口把对外开放的方法添加进该接口,实际上就是开放此接口让客户端

获得

 

 

 

 

2.     映射web.xml

通过配置web.xml来映射相应的路径,在web.xml添加如下代码

 

3.services配置文件

        创建services文件

               src目录下创建META-INF目录,在该目录下创建一个xfire目录在该目录

               下创建services.xml

通过配置此文件来公开我们的接口,客户端可以通过此文件的映射可以找到相应的需要公开的接口

 

获取wsdl文件的地址

 什么是wsdl

 参考: http://blog.csdn.net/sunchaohuang/archive/2008/10/14/3076375.aspx

 通过web.xmlservices.xml对地址的映射我们可以获得如下地址并进行访问后就可
     
以得到wsdl文件的url

访问的地址:
http://localhost:9099/HelloXfire/services/HelloXfire?wsdl

访问后会得到一个类似xml格式的内容 该文件就是一个wsdl文件

4.编写客户端

       客户端获得webserviceurl地址后创建对外开放的接口的实体类,然后向相应的方法传递参数,经过服务端相应的处理返回需要的结果

  

不同项目的webservice调用

       一般情况下webservice的调用都是在不同的项目间或者不同的语言中来使用的

       如果是不同的语言调用webservice应用:

              客户端如果是其他语言,则通过得到服务端生成的wsdl或者或者wsdl文件的
           
地址做相应的操作得到本语言具体的客户端实现类来调用服务端对外开放的
           
方法

    如果是不同项目间的调用(java语言为例)

        myeclipse下新建一个web service Client选择xfire下一步后选择wsdl
           
地址:
           
http://localhost:9099/HelloXfire/services/HelloXfire?wsdl

       完成后会自动生成相应的客户端类。

        HelloXfireClient类中调取服务端对外开放的接口方法获得相应数据

        具体代码如下

 

 

如果能够成功运行并正确获得调用的方法返回的值说明webservice成功实现了

 

 

    常见错误及解决办法:

 

       1.jar包冲突

       如果运行后得到以下错误

org.codehaus.xfire.XFireRuntimeException: Could not invoke service.. Nested exception is org.codehaus.xfire.fault.XFireFault: Could not marshall type.

 

说明jar包有冲突

解决办法

如果发现以下的包用多个

jaxb-api-1.0.jar
jaxb-api-2.0.jar
jaxb-impl-1.0.5.jar
jaxb-impl-2.0.1.jar

则删除低版本的

 

  2. Could not find valid implementation for: 2.0

如果出现如下错误

java.lang.IllegalStateException: Could not find valid implementation for: 2.0
 at org.apache.xbean.spring.context.impl.XBeanHelper.createBeanDefinitionReader(XBeanHelper.java:48)
 at org.codehaus.xfire.spring.XFireConfigLoader.getXFireApplicationContext(XFireConfigLoader.java:74)
 at org.codehaus.xfire.spring.XFireConfigLoader.loadContext(XFireConfigLoader.java:41)
 at org.codehaus.xfire.transport.http.XFireConfigurableServlet.loadConfig(XFireConfigurableServlet.java:86)

 

问题的原因是因为xfire不支持spring2.0的新特性,需要修改service.xml文件,将beans元素的命名空间放到services元素上,修改后的xml如下:

<beans>

 <services xmlns="http://xfire.codehaus.org/config/1.0">

 </services>

</beans>

另外,由于我使用了MyEclipseSpring CapailitiesWebService Capailities(使用xfire),由于后者自带了Spring1.2.6的包,造成了和2.0版本的冲突,所以必须作以下工作:

    删除<MyEclise_Home>/eclipse/plugins/com.genuitec.eclipse.ws.xfire_5.9.100/data/1.2/lib目录的Spring1.2.6

    删除Tomcat/Webapps/<项目目录>/WEB-INF/lib目录下的Spring1.2.6包(好像重新部署不能删除已经存在的包)

    重新启动MyEclipse

问题解决。

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值