web service開發時,wsdl2java 用戶端代碼的產生__web

來源:互聯網
上載者:User

在用到web service時,如果是調用自己開發的web service還好,可以有一個方法的介面或參數對象實體類什麼的,但如果是調用第三方的服務,除了得到web service服務地址的wsdl文檔外,沒有任何實質性編碼的東西,寫原生調用太麻煩,這時就需要自己寫一個方法的介面類。

這個,目前已經有比較成熟的工具,可以自動產生,下面作一下簡單的介紹。

 

apache的wsdl2java工具,目前貌似CXF和axis各有一套,使用方式大同小異,但產生的程式碼會有所區別,這時說的是CXF提供的wsdl2java工具。

 

wsdl2java用法:

wsdl2java -p com -d src -all  aa.wsdl

-p  指定其wsdl的命名空間,也就是要產生代碼的包名:

-d  指定要產生代碼所在目錄

-client 產生用戶端測試web service的代碼

-server 產生伺服器啟動web  service的代碼

-impl 產生web service的實現代碼

-ant  產生build.xml檔案

-all 產生所有開始端點代碼:types,service proxy,,service interface, server mainline, client mainline, implementation object, and an Ant build.xml file.

詳細用法見:http://cwiki.apache.org/CXF20DOC/wsdl-to-java.html

 

 

一開始使用了CXF的這套工具,發現不是很方便,畢竟依賴CXF提供的工具jar包,個人不是很喜歡用。

後來發現JDK居然也內建了對web service產生Java代碼的功能,貌似1.6版本開始的,試用後發現效果十分不錯,果斷投入它的懷抱。下面作下簡單的介紹,以備忘。

 

開啟jdk下的bin目錄 看下能否找到"wsimport.exe"這個檔案

一般情況下都會有

如果沒有則說明你的JDK不支援這個功能

然後在DOS視窗下輸入wsimport 敲斷行符號

如果提示錯誤的話 說明你的JDK環境變數還沒有配好

一句話總結,如果你在dos視窗下輸入wsimport正常,就可以

 

如果OK的話 輸入以下命令就可以將wsdl檔案產生java檔案了

wsimport http://127.0.0.1/TicketMobile/services/Cococ?wsdl  -keep -p com.llg.ws2 -s g:/ws

 

參數說明

wsimport 這個是必須的 該工具的名稱

http://127.0.0.1/TicketMobile/services/Cococ?wsdl  wsdl檔案

-keep  是否產生源檔案

-p com.llg.ws2  產生後的java包名

-s g:/ws    產生後放哪個目錄

 

 

但是前幾天,在對一個第三方提供的web service使用該工具產生java代碼的時候,居然出錯了,網上尋找後終於找到原因。

 

使用cxf wsdl2java或javax wsimport工具的時候,可能會遇到關於產生的Response類檔案名稱衝突的問題 

 

 

Console代碼   WSDLToJava Error: Thrown by JAXB : A class/interface with the same name "***" is already in use. Use a class customization to resolve this conflict.  

 

目前可選擇的方案: 

apache的wsdl2java工具,使用-autoNameResolution自動處理 

wsdl2java -autoNameResolution http://hello.joy2everyone.com/yourWebService?wsdl 

 

 

JDK內建的工具

wsimport -p com.test.client -keep http://hello.joy2everyone.com/yourWebService?wsdl -B-XautoNameResolution 

 

2.如果web service是己方開發的,可以修改代碼,使用自訂bindings,詳細可看sun webservice文檔 

 

例如: 

 

 

Java代碼   public interface ValidateCCService       @WebMethod       @WebResult(name = "response")       public ValidateCCResponse validateCC(@WebParam(name = "request")ValidateCCRequest request);  

 

這個情況下定義的方法名,如果使用工具產生用戶端代碼,很可能存在Response衝突,因為定義的wsdl中會有一個關於介面方法的message 

 

<wsdl:message name="validateCCResponse"> 

</wsdl:message> 

 

方法名定義的message與介面定義返回的ValidateCCResponse,在工具產生用戶端代碼時就會產生命名衝突。 

 

但是通過更改介面方法名為: 

 

 

Java代碼   public interface ValidateCCService       @WebMethod       @WebResult(name = "response")       public ValidateCCResponse validate(@WebParam(name = "request")ValidateCCRequest request);  

 

即可解決該衝突, 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.