隨筆-193  評(píng)論-715  文章-1  trackbacks-0
          本Blog所有內(nèi)容不得隨意轉(zhuǎn)載,版權(quán)屬于作者所有。如需轉(zhuǎn)載請(qǐng)與作者聯(lián)系( fastzch@163.com )。
          未經(jīng)許可的轉(zhuǎn)載,本人保留一切法律權(quán)益。
          一直以來(lái),發(fā)現(xiàn)有某些人完全不尊重我的勞動(dòng)成果,隨意轉(zhuǎn)載,提醒一下那些人小心哪天惹上官司。

          雖然XFire現(xiàn)在已經(jīng)被CXF取代,但在現(xiàn)在已經(jīng)開(kāi)發(fā)的項(xiàng)目中,還是有不少使用XFire來(lái)實(shí)現(xiàn)Web Service的。前段時(shí)間,我寫(xiě)的使用XFire開(kāi)發(fā)Web Service服務(wù)端的文章《XFire完整入門(mén)教程》受到了大家的好評(píng),給大家?guī)?lái)了方便,很是高興。今天來(lái)談?wù)動(dòng)肵Fire開(kāi)發(fā)客戶端。

          本文也將繼續(xù)使用上一篇文章的服務(wù)端來(lái)做為服務(wù)端。使用XFire開(kāi)發(fā)Web Service客戶端分為如下兩大類(lèi):
          一、服務(wù)提供者告訴你interface,你可以使用如下三種方式來(lái)開(kāi)發(fā):
          YourService即是服務(wù)提供者告訴給你的一個(gè)interface(當(dāng)然,也可以根據(jù)WSDL的定義,自己定義一個(gè)同樣的interface)。
          1,簡(jiǎn)單的方式
          Service?serviceModel?=?new?ObjectServiceFactory().create(YourService.class);
          YourService?service?
          =?(YourService)
          ????
          new?XFireProxyFactory().create(serviceModel,?"http://your/remote/url");
          2,JSR 181注釋的方式
          Service?serviceModel?=?new?AnnotationServiceFactory().create(YourService.class);
          YourService?client?
          =?(YourService)
          ????
          new?XFireProxyFactory().create(serviceModel,?"http://your/remote/url");
          3,混合方式
          Service?serviceModel?=
          ??
          new?AnnotationServiceFactory(
          ???
          new?Jsr181WebAnnotations(),
          ???XFireFactory.newInstance().getXFire().getTransportManager(),
          ???
          new?AegisBindingProvider(new?JaxbTypeRegistry())).create(YourService.class);

          二,通過(guò)WSDL創(chuàng)建一個(gè)動(dòng)態(tài)的客戶端,如下:
          package?test;

          import?java.net.MalformedURLException;
          import?java.net.URL;

          import?org.codehaus.xfire.client.Client;

          public?class?DynamicClientTest?{
          ????
          public?static?void?main(String[]?args)?throws?MalformedURLException,
          ????????????Exception?
          {
          ????????Client?client?
          =?new?Client(new?URL(
          ????????????????
          "http://localhost:8080/xfiretest/services/TestService?wsdl"));
          ????????Object[]?results?
          =?client
          ????????????????.invoke(
          "sayHello",?new?Object[]?{?"Firends"?});
          ????????System.out.println(results[
          0]);

          ????}

          }


          三,使用ANT工具或命令行通過(guò)WSDL生成一個(gè)客戶端:
          1,使用ANT生成客戶端,ANT腳本如下:
          <?xml?version="1.0"?>
          <project?name="wsgen"?default="wsgen"?basedir=".">
          ????
          <path?id="classpathId">
          ????????
          <fileset?dir="./WebRoot/WEB-INF/lib">
          ????????????
          <include?name="*.jar"?/>
          ????????
          </fileset>
          ????
          </path>
          ????
          <taskdef?classpathref="classpathId"?name="wsgen"?classname="org.codehaus.xfire.gen.WsGenTask">
          ????
          </taskdef>
          ????
          <target?name="wsgen"?description="generate?client">
          ????????
          <wsgen?outputDirectory="./src/"?wsdl="abc.wsdl"?binding="xmlbeans"?package="com.abc.p"?overwrite="true"?/>
          ????
          </target>
          </project>
          請(qǐng)注意,腳本中有一個(gè)參數(shù)binding,可以指定如下兩種不同的方式:
          (1)jaxb(Java Architecture for XML Binding,https://jaxb.dev.java.net/):使用此種方式時(shí),會(huì)自動(dòng)生成更多的Request和Resopnse類(lèi)。
          (2)xmlbeans
          調(diào)用方式如下:
          AbcServiceClient?client?=?new?AbcServiceClient();
          String?url?
          =?"http://localhost:8080/xfireTest/services/TestService";
          String?result?
          =?client.getAbcPort(url).sayHello("Robin");

          2,使用命令生成客戶端的命令如下:
          gpath=xfire-all-1.2-SNAPSHOT.jar:ant-1.6.5.jar:jaxb-api-2.0EA3.jar:stax-api-1.0.1.jar:jdom-1.0.jar:jaxb-impl-2.0EA3.jar\
          :jaxb
          -xjc-2.0-ea3.jar:wstx-asl-2.9.3.jar:commons-logging-1.0.4.jar:activation-1.1.jar:wsdl4j-1.5.2.jar:XmlSchema-1.0.3.jar:xfire-jsr181-api-1.0-M1.jar;

          java?
          -cp?$gpath?org.codehaus.xfire.gen.WsGen?-wsdl?http://localhost:8080/xfire/services/Bookservice?wsdl?-o?.?-p?pl.tomeks.client?-overwrite?true

          其結(jié)果與ANT生成的一樣。


          四,參考資源:
          1,XFire 1.2.6手冊(cè)(http://xfire.codehaus.org/User%27s+Guide)
          2,http://xfire.codehaus.org/Client+API
          3,http://xfire.codehaus.org/Dynamic+Client

          posted on 2008-08-28 23:26 Robin's Programming World 閱讀(52357) 評(píng)論(33)  編輯  收藏 所屬分類(lèi): Java

          評(píng)論:
          # re: 使用XFire開(kāi)發(fā)Web Service客戶端完整入門(mén)教程 2008-08-28 23:39 | softwave
          確實(shí),很多隨意轉(zhuǎn)載的非常可惡,連原始鏈接和出處都不標(biāo)明  回復(fù)  更多評(píng)論
            
          # re: 使用XFire開(kāi)發(fā)Web Service客戶端完整入門(mén)教程 2008-08-29 00:03 | Robin's Java World
          @softwave
          是呀,有些人太討厭了。  回復(fù)  更多評(píng)論
            
          # re: 使用XFire開(kāi)發(fā)Web Service客戶端完整入門(mén)教程[未登錄](méi) 2008-08-29 00:33 | 無(wú)名
          # re: 使用XFire開(kāi)發(fā)Web Service客戶端完整入門(mén)教程 2008-08-29 09:40 | Robin's Java World
          @無(wú)名
          剛剛看了,那篇文章主要是講服務(wù)端開(kāi)發(fā)的,對(duì)于客戶端的開(kāi)發(fā),我這里應(yīng)該是最完整的。  回復(fù)  更多評(píng)論
            
          # re: 使用XFire開(kāi)發(fā)Web Service客戶端完整入門(mén)教程 2008-10-21 17:00 | toby
          問(wèn)一下,如果是通過(guò)WSDL創(chuàng)建一個(gè)動(dòng)態(tài)的客戶端,參數(shù)是自定義的java對(duì)象如何傳遞:
          client.invoke("sayHello", new Object[] { 自定義類(lèi)型 });
          嗎?
          我經(jīng)過(guò)測(cè)試好像不行,運(yùn)行時(shí)報(bào)空指針異常。
            回復(fù)  更多評(píng)論
            
          # re: 使用XFire開(kāi)發(fā)Web Service客戶端完整入門(mén)教程[未登錄](méi) 2008-12-18 10:29 | tracy
          請(qǐng)教個(gè)問(wèn)題阿,ant 生成客戶端需要哪些包呢, 老是不停的報(bào)java.lang.NoClassDefFoundError

          我聲稱(chēng)時(shí)報(bào)錯(cuò):
          Buildfile: build.xml
          wsgen:

          BUILD FAILED
          build.xml:52: java.lang.NoClassDefFoundError

          Total time: 725 milliseconds  回復(fù)  更多評(píng)論
            
          # re: 使用XFire開(kāi)發(fā)Web Service客戶端完整入門(mén)教程 2008-12-26 20:45 | Yvon
          正好在找這方面的資料,謝謝啦  回復(fù)  更多評(píng)論
            
          # re: 使用XFire開(kāi)發(fā)Web Service客戶端完整入門(mén)教程 2009-05-05 16:40 | @@@
          Object[] results = client
          .invoke("sayHello", new Object[] { "Firends" });
          請(qǐng)問(wèn)這是調(diào)用sayHello 的它的參數(shù)是string
          那choose,test怎么調(diào)用
            回復(fù)  更多評(píng)論
            
          # re: 使用XFire開(kāi)發(fā)Web Service客戶端完整入門(mén)教程 2009-05-15 10:47 | jsp51.zhou
          請(qǐng)問(wèn),能不能異步調(diào)用啊。  回復(fù)  更多評(píng)論
            
          # re: 使用XFire開(kāi)發(fā)Web Service客戶端完整入門(mén)教程 2009-05-20 12:20 | 軟件代理服務(wù)
          你寫(xiě)錯(cuò)了,少寫(xiě)了一句代碼,你并沒(méi)有創(chuàng)建服務(wù)代理,你是這樣寫(xiě)的:Service serviceModel = new ObjectServiceFactory().create(YourService.class);
          YourService service = (YourService)
          new XFireProxyFactory().create(serviceModel, "http://your/remote/url");
          事實(shí)上,你實(shí)例話了一個(gè)新的XFireProxyFactory ,而這個(gè)沒(méi)有含義的
          應(yīng)該這樣寫(xiě):
          serviceModel = new ObjectServiceFactory().create(YourService.class);
          XFire xFire = XFireFactory.newInstance().getXFire();
          XFireProxyFactory factory = new XFireProxyFactory(xFire);
          YourService service = factory .create(serviceModel, "http://your/remote/url");
            回復(fù)  更多評(píng)論
            
          # re: 使用XFire開(kāi)發(fā)Web Service客戶端完整入門(mén)教程 2009-05-25 10:48 | rubby
          我感覺(jué)在中國(guó) web service 應(yīng)用很廣泛,但大家都知道皮毛而已。
          誰(shuí)能夠講清楚Axis Axis2 xfire,CFX,
          比較java和.net創(chuàng)建和調(diào)用web service?
          講述web service 的發(fā)展歷史?

          我就非常感謝。網(wǎng)上的都大同小異。這篇不錯(cuò)。  回復(fù)  更多評(píng)論
            
          # re: 使用XFire開(kāi)發(fā)Web Service客戶端完整入門(mén)教程 2009-06-22 10:06 | isly
          請(qǐng)問(wèn),我用動(dòng)態(tài)生成客戶端的方式,在main函數(shù)中運(yùn)行ok,但是通過(guò)tomcat訪問(wèn)為什么報(bào)javax.servlet.ServletException: javax/wsdl/factory/WSDLFactory
          異常呢,而且我試過(guò)把項(xiàng)目中的包拷到tomcat下還是一樣。  回復(fù)  更多評(píng)論
            
          # re: 使用XFire開(kāi)發(fā)Web Service客戶端完整入門(mén)教程 2009-08-14 15:22 | jiangli19192
          package test;

          import java.net.MalformedURLException;
          import java.net.URL;

          import org.codehaus.xfire.client.Client;

          public class DynamicClientTest {
          public static void main(String[] args) throws MalformedURLException,
          Exception {
          Client client = new Client(new URL(
          "http://localhost:8080/xfiretest/services/TestService?wsdl"));
          Object[] results = client
          .invoke("sayHello", new Object[] { "Firends" });
          System.out.println(results[0]);

          }
          }

          運(yùn)行的之后拋出:
          Exception in thread "main" java.lang.NoClassDefFoundError: javax/wsdl/factory/WSDLFactory
          at org.codehaus.xfire.client.Client.<init>(Client.java:235)
          at org.codehaus.xfire.client.Client.<init>(Client.java:246)
          at com.centfor.zmd.Test.main(Test.java:32)
          Caused by: java.lang.ClassNotFoundException: javax.wsdl.factory.WSDLFactory
          at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
          at java.security.AccessController.doPrivileged(Native Method)
          at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
          at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
          at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
          at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
          at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
          ... 3 more  回復(fù)  更多評(píng)論
            
          # re: 使用XFire開(kāi)發(fā)Web Service客戶端完整入門(mén)教程[未登錄](méi) 2009-08-18 01:11 | jeff
          就這些東西還當(dāng)個(gè)屁似的,本來(lái)就是拾人老外牙慧,還牛逼哄哄的。真是無(wú)語(yǔ)!  回復(fù)  更多評(píng)論
            
          # re: 使用XFire開(kāi)發(fā)Web Service客戶端完整入門(mén)教程[未登錄](méi) 2010-02-05 12:32 | mask
          請(qǐng)教樓主一個(gè)問(wèn)題,我現(xiàn)在建立客戶端使用的下面這種方式:
          package test;

          import java.net.MalformedURLException;
          import java.net.URL;

          import org.codehaus.xfire.client.Client;

          public class DynamicClientTest {
          public static void main(String[] args) throws MalformedURLException,
          Exception {
          Client client = new Client(new URL(
          "http://localhost:8080/xfiretest/services/TestService?wsdl"));
          Object[] results = client
          .invoke("sayHello", new Object[] { "Firends" });
          System.out.println(results[0]);

          }
          }
          我現(xiàn)在的客戶端是建立在EJB應(yīng)用上的,建立完以后,運(yùn)行該類(lèi)沒(méi)有問(wèn)題,可以正確輸出結(jié)果,但是當(dāng)我把main方法改成我的一個(gè)返回webservice結(jié)果的普通方法,在EJB的會(huì)話BEAN里調(diào)用的時(shí)候就是出一個(gè)很奇怪的異常:
          Caused by: java.lang.NumberFormatException: For input string: ""
          at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
          at java.lang.Integer.parseInt(Integer.java:468)
          at java.lang.Integer.parseInt(Integer.java:497)
          at org.codehaus.xfire.transport.http.CommonsHttpMessageSender.createClient(CommonsHttpMessageSender.java:276)
          at org.codehaus.xfire.transport.http.CommonsHttpMessageSender.open(CommonsHttpMessageSender.java:129)
          at org.codehaus.xfire.transport.http.HttpChannel.sendViaClient(HttpChannel.java:121)
          at org.codehaus.xfire.transport.http.HttpChannel.send(HttpChannel.java:48)
          at org.codehaus.xfire.handler.OutMessageSender.invoke(OutMessageSender.java:26)
          at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)
          請(qǐng)問(wèn)樓主遇到過(guò)這樣的問(wèn)題嗎?期待樓主的回復(fù)  回復(fù)  更多評(píng)論
            
          # re: 使用XFire開(kāi)發(fā)Web Service客戶端完整入門(mén)教程 2010-02-08 15:28 | nick.xiao
          寫(xiě)的很詳細(xì),thanks  回復(fù)  更多評(píng)論
            
          # re: 使用XFire開(kāi)發(fā)Web Service客戶端完整入門(mén)教程 2010-03-26 17:25 | swarding99
          寫(xiě)的很好,很詳細(xì)。多謝  回復(fù)  更多評(píng)論
            
          # re: 使用XFire開(kāi)發(fā)Web Service客戶端完整入門(mén)教程[未登錄](méi) 2010-04-26 17:28 | Jack
          @softwave
          轉(zhuǎn)載確實(shí)可惡,但部分還是喜歡文章而黏貼到自己博客以供查閱。
          以文章盈利或者打造博客排行為目的的,少  回復(fù)  更多評(píng)論
            
          # re: 使用XFire開(kāi)發(fā)Web Service客戶端完整入門(mén)教程 2010-11-09 10:00 | 雨風(fēng)
          借用一下樓上朋友的代碼,我也出現(xiàn)了同樣的問(wèn)題,請(qǐng)教樓主該怎么解決?

          package test;

          import java.net.MalformedURLException;
          import java.net.URL;

          import org.codehaus.xfire.client.Client;

          public class DynamicClientTest {
          public static void main(String[] args) throws MalformedURLException,
          Exception {
          Client client = new Client(new URL(
          "http://localhost:8080/xfiretest/services/TestService?wsdl"));
          Object[] results = client
          .invoke("sayHello", new Object[] { "Firends" });
          System.out.println(results[0]);

          }
          }

          運(yùn)行的之后拋出:
          Exception in thread "main" java.lang.NoClassDefFoundError: javax/wsdl/factory/WSDLFactory
          at org.codehaus.xfire.client.Client.<init>(Client.java:235)
          at org.codehaus.xfire.client.Client.<init>(Client.java:246)
          at com.centfor.zmd.Test.main(Test.java:32)
          Caused by: java.lang.ClassNotFoundException: javax.wsdl.factory.WSDLFactory
          at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
          at java.security.AccessController.doPrivileged(Native Method)
          at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
          at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
          at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
          at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
          at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
          ... 3 more  回復(fù)  更多評(píng)論
            
          # re: 使用XFire開(kāi)發(fā)Web Service客戶端完整入門(mén)教程 2010-11-12 09:35 | Robin's Java World
          @雨風(fēng)
          很明顯,差一些lib,請(qǐng)下載并放到lib目錄中。  回復(fù)  更多評(píng)論
            
          # re: 使用XFire開(kāi)發(fā)Web Service客戶端完整入門(mén)教程 2011-07-12 18:21 | 劍天
          @toby
          你那種方法只是調(diào)用普通的webservice,對(duì)于一些復(fù)雜類(lèi)型的處理,是處理不了的,這篇文章是講如何處理復(fù)雜類(lèi)型的,我建議你去學(xué)學(xué)cxf框架吧,你會(huì)知道java開(kāi)發(fā)webservice有多么的神奇,在回來(lái)看看這個(gè)原始的,cxf是起源于xfire,  回復(fù)  更多評(píng)論
            
          # re: 使用XFire開(kāi)發(fā)Web Service客戶端完整入門(mén)教程 2011-09-07 11:06 | xufeng52645264
          我的解決了,需要在工程中添加xfire相關(guān)的庫(kù),工程右鍵-構(gòu)建路徑-配置構(gòu)建路徑-庫(kù)-添加庫(kù)-MyEclipseLibrary-選中Xfire1.2 Core Libraries、HTTP Client~、JAXB2 ~三個(gè)-確定,OK!@isly
            回復(fù)  更多評(píng)論
            
          # re: 使用XFire開(kāi)發(fā)Web Service客戶端完整入門(mén)教程[未登錄](méi) 2011-09-30 16:15 | song
          您好,
          遇到的問(wèn)題:我現(xiàn)在需要調(diào)用別人發(fā)布的webservice;他們提供了webservice的接口地址和方法名稱(chēng)及參數(shù),返回值
          現(xiàn)在想要使用xfire實(shí)現(xiàn)訪問(wèn),大概應(yīng)該做哪些步驟...
          謝謝.
            回復(fù)  更多評(píng)論
            
          # re: 使用XFire開(kāi)發(fā)Web Service客戶端完整入門(mén)教程 2011-11-22 10:59 | CriusGong
          Hi Robin!
          謝謝你的文章,對(duì)我們這些初學(xué)者受益匪淺。現(xiàn)我碰到一下問(wèn)題,這個(gè)問(wèn)題應(yīng)該很簡(jiǎn)單,但是我不清楚這個(gè)url的運(yùn)行,可以給點(diǎn)指點(diǎn)嗎?
          - Server returned error code = 404 for URI : http://localhost:8001/Studey_pjt/services/HelloService. Check server logs for details

            回復(fù)  更多評(píng)論
            
          # re: 使用XFire開(kāi)發(fā)Web Service客戶端完整入門(mén)教程 2012-07-08 01:52 | 567
          # re: 使用XFire開(kāi)發(fā)Web Service客戶端完整入門(mén)教程 2013-01-29 16:08 | chengxx
          您好,我這也是報(bào)空指針異常,您解決了嗎?athena2007@126.com能發(fā)郵件給我嗎,非常感謝@toby
            回復(fù)  更多評(píng)論
            
          # re: 使用XFire開(kāi)發(fā)Web Service客戶端完整入門(mén)教程 2013-02-01 17:00 | yumaoer
          AbcServiceClient client = new AbcServiceClient();
          String url = "http://localhost:8080/xfireTest/services/TestService";
          String result = client.getAbcPort(url).sayHello("Robin");
          新手請(qǐng)教:AbcServiceClient 這個(gè)類(lèi)和 getAbcPort這個(gè)方法是怎么來(lái)的啊?
            回復(fù)  更多評(píng)論
            
          # re: 使用XFire開(kāi)發(fā)Web Service客戶端完整入門(mén)教程 2013-02-28 08:37 | a3
          @jeff
          你屁真多  回復(fù)  更多評(píng)論
            
          # re: 使用XFire開(kāi)發(fā)Web Service客戶端完整入門(mén)教程[未登錄](méi) 2013-05-25 19:55 | wang
          外部包不全@jiangli19192
            回復(fù)  更多評(píng)論
            
          # re: 使用XFire開(kāi)發(fā)Web Service客戶端完整入門(mén)教程 2013-06-07 17:20 | promise
          invoke里面的蠶食都是啥意思@mask
            回復(fù)  更多評(píng)論
            
          # re: 使用XFire開(kāi)發(fā)Web Service客戶端完整入門(mén)教程 2014-05-04 18:08 | kunlun122
          @promise
          org.codehaus.xfire.fault.XFireFault: System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.NullReferenceException: Object reference not set to an instance of an object.
          我用動(dòng)態(tài)客戶端調(diào)用c#寫(xiě)的webservice,報(bào)上面這個(gè)錯(cuò)誤  回復(fù)  更多評(píng)論
            
          # re: 使用XFire開(kāi)發(fā)Web Service客戶端完整入門(mén)教程 2014-05-04 18:09 | kunlun122
          @kunlun122
          這個(gè)webservice有soap1.1,也有soap1.2,我想問(wèn)xfire用的是哪個(gè)標(biāo)準(zhǔn)?
            回復(fù)  更多評(píng)論
            
          # re: 使用XFire開(kāi)發(fā)Web Service客戶端完整入門(mén)教程[未登錄](méi) 2014-06-04 20:18 | ANDY
          你好啊。我用的是動(dòng)態(tài)創(chuàng)建的方法啊,但是為什么斷點(diǎn)到服務(wù)端,字符串參數(shù)都是空的呢??請(qǐng)指教下。。。。  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 昌邑市| 陕西省| 平江县| 澜沧| 罗平县| 濮阳县| 平利县| 张家口市| 玉林市| 龙泉市| 绍兴县| 冷水江市| 蓬安县| 静乐县| 盐池县| 吴川市| 宜昌市| 来安县| 集贤县| 安塞县| 武穴市| 丰县| 昌黎县| 施甸县| 西乌珠穆沁旗| 吉水县| 德令哈市| 墨脱县| 永济市| 浦北县| 沽源县| 镇赉县| 德令哈市| 惠安县| 宜川县| 铜川市| 称多县| 八宿县| 陕西省| 张掖市| 大厂|