XFire令WebService如斯简单
运行环境:JBOXX 4.04 、 Tomcat <st1:chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899">5.3.9</st1:chsdate>
开发工具:Eclipse3.1 + MyEclipse 4.0
1. 利用xFire发布WebService<o:p></o:p>
对于一般的接口方法,即方法的返回类型或参数不是List或Map中存放对象的方法,则只需要两步简单的配置即可。
一、配置web.xml
添加一个servlet
- <servlet>
- <servlet-name>webservice</servlet-name>
- <servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>webservice</servlet-name>
- <url-pattern>/servlet/XFireServlet/*</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>webservice</servlet-name>
- <url-pattern>/services/*</url-pattern>
- </servlet-mapping>
一、建立services.xml
在源代码包src(也可能是其它的名称)下建立META-INF/xfire文件夹,并在下面建立services.xml文件。
- <!-- START SNIPPET: services -->
- <beans xmlns="http://xfire.codehaus.org/config/1.0">
- <service >
- <name>helloWorld</name>
- <namespace>http://6.1.8.16:8080/xfireWebService/services/helloWorld</namespace>
- <serviceClass>com.excellence.webservice.test.helloWorld</serviceClass>
- <implementationClass>com.excellence.webservice.test.HelloWorldImpl</implementationClass>
- </service>
- </beans>
- <!-- END SNIPPET: services -->
一 name 元素:表示该webService的名称<o:p></o:p>
二 namespace 元素:表示该webService的命名空间<o:p></o:p>
三 serviceClass 元素:表示该webService的接口<o:p></o:p>
四 implementationClass 元素:表示该webService的实现类<o:p></o:p>
<o:p></o:p>
对!就是这么简单,就可以啦。
<o:p></o:p>
如果返回类型是List或Map,并且里面存放的是自定义类的话,则需要增加一个对于服务接口的配置文件。该文件的命名规则是 接口文件名.aegis.xml。例如接口是HelloWorld.java的话,则此配置文件命名为HelloWorld.aegis.xml。<o:p></o:p>
- <?xml version="1.0" encoding="UTF-8"?>
- <mappings>
- <mapping >
- <method name="getUsers">
- <return-type componentType="com.excellence.webservice.test.User"/>
- </method>
- </mapping>
- </mappings>
getUsers方法返回类型是List,里面装的User对象。对于这种类型的方法,在配置文件中描述了它的返回值类型。<o:p></o:p>
如果返回的类型是Map的话,做法和List一样。但定义的类型,是Map中的Value部分,并且这样的话,Map中Value所存放的对象就必须全部是同一种类啦。<o:p></o:p>
但websphere application server 和weblogic不行
org.codehaus.xfire.fault.XFireFault: Couldn't instantiate class. cn.lsdf.ebs.webservice.remote.OrderForm异常,怎么回事。
<?xml version="1.0" encoding="UTF-8"?> <mappings> <mapping > <method name="getOrderForms"> <return-type componentType="cn.lsdf.ebs.webservice.remote.OrderForm"/> </method> <method name="getOrderForm"> <return-type componentType="cn.lsdf.ebs.webservice.remote.OrderForm"/> </method> </mapping> </mappings>
需要一个无参的构造器。
/** * 版权信息: * 文件编号:TestCallWebService.java * 文件名称: * 系统编号: * 系统名称: * 设计作者: * 完成日期:2006-11-3 * 设计文档: * 内容摘要: * * 修改记录1: * 修改日期: * 修 改 人: * 修改内容: * 包括Bug/变更:<bug/变更 ID> 活动标题 > * */ package com.zte.ihs.eyouems.test; import java.net.MalformedURLException; import java.net.URL; import org.codehaus.xfire.client.Client; /** * 类 编 号:TestCallWebService.java * 类 名 称: * 内容摘要: * 完成日期: * 编码作者: */ public class TestCallWebService { //记得传入WebServer的服务地址,应该从常量配置中获得。 URL ServerUrl = null; public String sendESBMessage(String webServiceURL, String xmlStr) { try { ServerUrl = new URL(webServiceURL); } catch (MalformedURLException e1) { e1.printStackTrace(); } Client client = null; Object[] returnMessage = null; try { client = new Client(ServerUrl); //就是这里了,指定调用的方法,并传入参数 returnMessage = client.invoke("SendMsg", new Object[] { "测试", xmlStr }); } catch (Exception e) { e.printStackTrace(); } String receiveMessage = (String) returnMessage[0]; return receiveMessage; } }
我现在没有环境,所以没有发错误信息。
大家知道怎么解决吗?