如何用WSDL4J構建Spring+AXIS自動建立的Web service對應客戶端
個人另外一篇博文Spring集成AXIS2的Web service配置方法(
http://dannyyuan.blog.51cto.com/212520/160504)提過到如何用Spring+AXIS自動完成WSDL的定義和對象拆裝/封裝,簡單地把Spring聲明的bean全部公開方法轉換成Web service方法。
而Apache項目WSDL4J則是根據WSDL的XML文檔就能夠自動生成Web service的客戶端代碼,這樣的話,構建web service服務端和客戶端都顯得沒有多少手工編碼了。其實WSDL4J也是能夠生成服務端代碼的,但是手工編寫WSDL還不如用AXIS自動生成來得快。
用WSDL4J建立客戶端代碼的命令以下:
java -cp %AXIS_CLASSPATH% java org.apache.axis.wsdl.WSDL2Java -o DIR_NAME -p PACKAGE_NAME
http://ws-server/proj-name/services/service-name?wsdl 其中AXIS_CLASSPATH應該包括axis.jar,commons-discovery.jar,commons-logging.jar,jaxrpc.jar,log4j.jar,saaj.jar,wsdl4j.jar,activation.jar,mail.jar。 該命令會在所指定目錄下建立JAVA包,裏面有[web_service]Locator.java, [web_service].java, [web_service]PortType.java, [web_service]SOAP11BindingStub.java,[web_service]SOAP12BindingStub.java,以及方法中全部涉及的參數bean等。 客戶代碼只需new [web_service]Locator實例,其實現了[web_service]接口,用get[web_service]SOAP11port_http(URL)方法取得方法實現對象[web_service]PortType實現,能夠直接調用其方法像本地方法同樣了。URL若是是HTTPS協議的,須要設SSL證書路徑到系統屬性配置中去(System.setProperty("javax.net.ssl.trustStore","ssl.cer");) 上面的都是簡單的工具描述,但是若是不注意會出現一些意料不到的問題。 一、首先AXIS自動發佈的WS方法參數會自動對應bean方法的參數名,結果在構建SOAP元素XML標籤會映射過來,若是你用AOP想實現基本檢驗和類型檢查之類的攔截的話,就要當心SOAP元素名與bean方法參數名的關係了; 二、其次WSDL2JAVA小工具好像不支持HTTPS(用戶檢驗支持),這時能夠用瀏覽器打開WSDL文檔而後保存成文件被調用; 三、生成的JAVA代碼會把URL寫死(若是WSDL2JAVA工具用URL參數),因此默認建立PortType(不帶參數)的方法會用到該URL; 四、若是Spring的ws 方法參數有通用類型如Object會致使序列化/反序列化去錯,必須參數和返回類型保證爲POJO對象或基本數據類型。 五、AXIS2有一些不一樣之處,需注意AXIS2基於JDK6。