?
运行环境: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; } }
我现在没有环境,所以没有发错误信息。
大家知道怎么解决吗?