在用到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);
即可解決該衝突,