天天看點

jax-ws調用c#webservice服務之Holder

JAX-WS調用C#WebService服務之引用(Holder)傳值

最近需要将一個開發好的JAVA項目內建到.NET平台上,因為需要調用.NET那邊的權限資訊,是以必不可少的需要用到WebService。

首先是WerService的選型問題,常用的WebService開發架構主要有XFire、AXIS2、CXF、JAX-WS三種,XFire、CXF以前都使用過,優點很多,但是有一個讓我自己無法忍受的一個缺點就是依賴太多,對于AXIS2貌似依賴也很多,但是聽說可以生成不同語言的用戶端,這點功能很強大。經過一番選擇之後最終選擇了JAX-WS,至于理由大約有兩條,在JDK1.6中包含了JAX-WS,沒有任何依賴,通過指令很友善的生成JAVA用戶端代碼和釋出WebService服務。

對于JAX-WS的基礎就不多說了,百度之後十分鐘就可以釋出一個服務和生成用戶端代碼,現在主要講一下WebService中的引用傳值

現在遇到這樣的情況需要通過參數傳值

 C#中服務代碼:Public void getInfo(Ref Department department);

JAVA中生成WebService代碼:

Public voidgetInfo(Holder<Department> department);

對于Holder這個東西感覺很陌生,随之baidu了一下:

發現網上很少有這方面的問題,就算有也沒有解決的,最後通過google找到了一篇比較好的文章(http://tomee.apache.org/examples-trunk/webservice-holder/),具體摘要如下:

With SOAP it is possible to returnmultiple values in a single request. This is impossible in Java as a method canonly return one object.

JAX-WSsolves this problem with the concept of Holders. A javax.xml.ws.Holder is a simple wrapper object that canbe passed into the @WebService methodas a parameter. The application sets the value of the holder during the requestand the server will send the value back as an OUT parameter.

翻譯如下:在webservice中,一次請求可以可能需要傳回多個值,在java中一次請求傳回一個對象是可以的。

JAX-WS通過Holder方式解決了這個問題,jax-ws的Holder僅僅是對一個對象的封裝,可以作為一個服務方法的參數傳遞,在請求中,應用會給holder指派,服務會将這個值以參數的方式傳回。

然後将Department包裝成Holder的形式發現,對于基本的類型是可以的,比如String ,List<對象>,Int等等。但是對于自定義對象确實不行的,經過一番百度、谷歌最終解決:

MYEntity entity=new MYEntity();

    Holder<MYEntity>denter=newHolder<MYEntity>(entity);

将entity傳入Holder中即可。

繼續閱讀