今天排查同事的一個很奇怪的問題,現在將今天遇到的問題列舉出來。
在調用外圍系統的webservice服務時候,一般來說對方會提供一個wsdl,然後我們要根據wsdl生成相應的類,通過這種方式,做到了跨語言的完美方案,但是也帶來了一些複雜性。在java中我們一般使用jdk自帶的wsimport工具或者其他三方系統的wsdl4j工具生成java版本的stub實現。
- 使用jdk裏面自帶的wsimport工具,具體使用辦法如下:
在JDK的bin文件夾中,有一個wsimport.exe,這個工具依據wsdl文件生成相應的類文件,然後用這些類文件,就可以像調用本地的類一樣調用WebService提供的方。該工具可以用於非Java的服務器,如:用C#編寫的WebService,通過wsimport則生成Java的客戶端實現。
在命令提示符中使用如下命令:
wsimport http://localhost:8080/Demo/services/MyService?wsdl
- 使用第三方ws框架,以cxf爲例:
使用一下webservice的框架自帶的一下wsdl4j生成,由於衆所周知的原因,java的webservice的框架很多,經常由於版本和實現的不同,會出現一下莫名奇妙的問題,所以這個地方還是推薦使用你所使用的框架的wsdl4j工具生成相應的stub。
- 下載apache-cxf-2.5.11.zip並解壓到D:\apache-cxf-2.5.11,下載地址:http://mirror.bjtu.edu.cn/apache/cxf/2.5.11/apache-cxf-2.5.11.tar.gz
- 在D:\apache-cxf-2.5.11\bin目錄下面執行命令:wsdl2java http://xxx.yyy.com:8102/ws/UserRemoteService?wsdl
- 命令執行完成後在相關文件夾中會生成相應的代碼,將代碼全部引入接入系統,與wsimport是相同的
使用過程中遇到的問題:
- 在使用的過程中發現一個問題,由於jdk6最高只支持ws2.1規範版本,所以在jdk6下面生成的時候,要加上-frontend jaxws21
wsdl2java -frontend jaxws21 http://xxx.yyy.com:8102/ws/UserRemoteService?wsdl
- 發現可以根據wsdl生成java類,java類中的註釋有可能是中文,所以要加上encoding參數,例如:-encoding utf-8
wsdl2java -ecoding utf-8 http://xxx.yyy.com:8102/ws/UserRemoteService?wsdl