隨筆-193  評論-715  文章-1  trackbacks-0
          本Blog所有內容不得隨意轉載,版權屬于作者所有。如需轉載請與作者聯系( fastzch@163.com )。
          未經許可的轉載,本人保留一切法律權益。
          一直以來,發現有某些人完全不尊重我的勞動成果,隨意轉載,提醒一下那些人小心哪天惹上官司。

          雖然XFire現在已經被CXF取代,但在現在已經開發的項目中,還是有不少使用XFire來實現Web Service的。前段時間,我寫的使用XFire開發Web Service服務端的文章《XFire完整入門教程》受到了大家的好評,給大家帶來了方便,很是高興。今天來談談用XFire開發客戶端。

          本文也將繼續使用上一篇文章的服務端來做為服務端。使用XFire開發Web Service客戶端分為如下兩大類:
          一、服務提供者告訴你interface,你可以使用如下三種方式來開發:
          YourService即是服務提供者告訴給你的一個interface(當然,也可以根據WSDL的定義,自己定義一個同樣的interface)。
          1,簡單的方式
          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);

          二,通過WSDL創建一個動態的客戶端,如下:
          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工具或命令行通過WSDL生成一個客戶端:
          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>
          請注意,腳本中有一個參數binding,可以指定如下兩種不同的方式:
          (1)jaxb(Java Architecture for XML Binding,https://jaxb.dev.java.net/):使用此種方式時,會自動生成更多的Request和Resopnse類。
          (2)xmlbeans
          調用方式如下:
          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

          其結果與ANT生成的一樣。


          四,參考資源:
          1,XFire 1.2.6手冊(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 閱讀(52356) 評論(33)  編輯  收藏 所屬分類: Java

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

          我聲稱時報錯:
          Buildfile: build.xml
          wsgen:

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

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

          我就非常感謝。網上的都大同小異。這篇不錯。  回復  更多評論
            
          # re: 使用XFire開發Web Service客戶端完整入門教程 2009-06-22 10:06 | isly
          請問,我用動態生成客戶端的方式,在main函數中運行ok,但是通過tomcat訪問為什么報javax.servlet.ServletException: javax/wsdl/factory/WSDLFactory
          異常呢,而且我試過把項目中的包拷到tomcat下還是一樣。  回復  更多評論
            
          # re: 使用XFire開發Web Service客戶端完整入門教程 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]);

          }
          }

          運行的之后拋出:
          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  回復  更多評論
            
          # re: 使用XFire開發Web Service客戶端完整入門教程[未登錄] 2009-08-18 01:11 | jeff
          就這些東西還當個屁似的,本來就是拾人老外牙慧,還牛逼哄哄的。真是無語!  回復  更多評論
            
          # re: 使用XFire開發Web Service客戶端完整入門教程[未登錄] 2010-02-05 12:32 | mask
          請教樓主一個問題,我現在建立客戶端使用的下面這種方式:
          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]);

          }
          }
          我現在的客戶端是建立在EJB應用上的,建立完以后,運行該類沒有問題,可以正確輸出結果,但是當我把main方法改成我的一個返回webservice結果的普通方法,在EJB的會話BEAN里調用的時候就是出一個很奇怪的異常:
          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)
          請問樓主遇到過這樣的問題嗎?期待樓主的回復  回復  更多評論
            
          # re: 使用XFire開發Web Service客戶端完整入門教程 2010-02-08 15:28 | nick.xiao
          寫的很詳細,thanks  回復  更多評論
            
          # re: 使用XFire開發Web Service客戶端完整入門教程 2010-03-26 17:25 | swarding99
          寫的很好,很詳細。多謝  回復  更多評論
            
          # re: 使用XFire開發Web Service客戶端完整入門教程[未登錄] 2010-04-26 17:28 | Jack
          @softwave
          轉載確實可惡,但部分還是喜歡文章而黏貼到自己博客以供查閱。
          以文章盈利或者打造博客排行為目的的,少  回復  更多評論
            
          # re: 使用XFire開發Web Service客戶端完整入門教程 2010-11-09 10:00 | 雨風
          借用一下樓上朋友的代碼,我也出現了同樣的問題,請教樓主該怎么解決?

          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]);

          }
          }

          運行的之后拋出:
          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  回復  更多評論
            
          # re: 使用XFire開發Web Service客戶端完整入門教程 2010-11-12 09:35 | Robin's Java World
          @雨風
          很明顯,差一些lib,請下載并放到lib目錄中。  回復  更多評論
            
          # re: 使用XFire開發Web Service客戶端完整入門教程 2011-07-12 18:21 | 劍天
          @toby
          你那種方法只是調用普通的webservice,對于一些復雜類型的處理,是處理不了的,這篇文章是講如何處理復雜類型的,我建議你去學學cxf框架吧,你會知道java開發webservice有多么的神奇,在回來看看這個原始的,cxf是起源于xfire,  回復  更多評論
            
          # re: 使用XFire開發Web Service客戶端完整入門教程 2011-09-07 11:06 | xufeng52645264
          我的解決了,需要在工程中添加xfire相關的庫,工程右鍵-構建路徑-配置構建路徑-庫-添加庫-MyEclipseLibrary-選中Xfire1.2 Core Libraries、HTTP Client~、JAXB2 ~三個-確定,OK!@isly
            回復  更多評論
            
          # re: 使用XFire開發Web Service客戶端完整入門教程[未登錄] 2011-09-30 16:15 | song
          您好,
          遇到的問題:我現在需要調用別人發布的webservice;他們提供了webservice的接口地址和方法名稱及參數,返回值
          現在想要使用xfire實現訪問,大概應該做哪些步驟...
          謝謝.
            回復  更多評論
            
          # re: 使用XFire開發Web Service客戶端完整入門教程 2011-11-22 10:59 | CriusGong
          Hi Robin!
          謝謝你的文章,對我們這些初學者受益匪淺。現我碰到一下問題,這個問題應該很簡單,但是我不清楚這個url的運行,可以給點指點嗎?
          - Server returned error code = 404 for URI : http://localhost:8001/Studey_pjt/services/HelloService. Check server logs for details

            回復  更多評論
            
          # re: 使用XFire開發Web Service客戶端完整入門教程 2012-07-08 01:52 | 567
          567  回復  更多評論
            
          # re: 使用XFire開發Web Service客戶端完整入門教程 2013-01-29 16:08 | chengxx
          您好,我這也是報空指針異常,您解決了嗎?athena2007@126.com能發郵件給我嗎,非常感謝@toby
            回復  更多評論
            
          # re: 使用XFire開發Web Service客戶端完整入門教程 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");
          新手請教:AbcServiceClient 這個類和 getAbcPort這個方法是怎么來的?。?
            回復  更多評論
            
          # re: 使用XFire開發Web Service客戶端完整入門教程 2013-02-28 08:37 | a3
          @jeff
          你屁真多  回復  更多評論
            
          # re: 使用XFire開發Web Service客戶端完整入門教程[未登錄] 2013-05-25 19:55 | wang
          外部包不全@jiangli19192
            回復  更多評論
            
          # re: 使用XFire開發Web Service客戶端完整入門教程 2013-06-07 17:20 | promise
          invoke里面的蠶食都是啥意思@mask
            回復  更多評論
            
          # re: 使用XFire開發Web Service客戶端完整入門教程 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.
          我用動態客戶端調用c#寫的webservice,報上面這個錯誤  回復  更多評論
            
          # re: 使用XFire開發Web Service客戶端完整入門教程 2014-05-04 18:09 | kunlun122
          @kunlun122
          這個webservice有soap1.1,也有soap1.2,我想問xfire用的是哪個標準?
            回復  更多評論
            
          # re: 使用XFire開發Web Service客戶端完整入門教程[未登錄] 2014-06-04 20:18 | ANDY
          你好啊。我用的是動態創建的方法啊,但是為什么斷點到服務端,字符串參數都是空的呢??請指教下。。。。  回復  更多評論
            
          主站蜘蛛池模板: 江达县| 金塔县| 六盘水市| 闽侯县| 吕梁市| 札达县| 保定市| 浦江县| 常德市| 文化| 广平县| 武川县| 阳信县| 蓬安县| 兴山县| 长葛市| 泰安市| 翁牛特旗| 嘉义县| 镇巴县| 麟游县| 开封县| 舒兰市| 筠连县| 涿州市| 泌阳县| 尖扎县| 滨州市| 夏河县| 东乡县| 米脂县| 邳州市| 得荣县| 黄浦区| 康乐县| 杭锦旗| 崇明县| 邳州市| 徐汇区| 盐山县| 凤山市|