2012年12月4日 星期二

[筆記] 透過wsimport 去產生 web service client 的程式碼



最近因為業務需求,必須要碰好久沒有寫的 SOAP Web Service,不過感覺這已經是上個世代的產物了,現在幾乎所有的應用都是用Restful和Json的組合,應該很少人還在用龐大又笨重的SOAP了吧?不過因為要跟舊系統介接所以沒辦法...╮(╯▽╰)╭

說到SOAP我第一個想到的就是找Code Gen的tool,透過wsdl去產生client和server的code,在,然後我依稀記得我以前都是用Eclipse + ( Axis2 or CXF )去產生,不知道後來還有沒有更新的技術或是更方便的方法,比如說類似Gson這種玩意?

拜了一下Google大神,才發現居然現在JDK裡面就有附工具了!! 大概是因為jax-ws已經成為標準化套件了吧?所以現在我只需要打下面那行指令就好了。

wsimport -d ./target/classes -s ./main/src/java -p com.doxa.ws.client http://localhost:8080/WebServices/services/test?wsdl


使用方法如下  wsimport -d [classes path] -s [src path] -p [target package] [wsdl url]
參數說明:
-d:產生的 class 檔要放在哪裡(不含 package 路徑)
-s:產生的 java 檔要放在哪裡(不含 package 路徑)
-p:要產生到哪個 package

打好收工!!哪有那麼好的事....因為舊系統的wsdl網址是"https",而且還是用self-sign certificate的SSL憑證...所以如果直接打上面那行指令馬上就會出現以下錯誤:
parsing WSDL...
[ERROR] sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested targetFailed to read the WSDL document: http://localhost:8080/WebServices/services/test?wsdl, because 1) could not find the document; /2) the document could not be read; 3) the root element of the document is not .
[ERROR] failed.noservice=Could not find wsdl:service in the provided WSDL(s): At least one WSDL with at least one service definition needs to be provided. Failed to parse the WSDL. Result: 1


所以下一篇在來談要怎麼解決SSL連線的問題...


張貼留言