2009-09-08 89 views
2

我遇到了問題。如何動態生成Web服務客戶端

設在另一邊,WSDL將永遠改變,

例如,上descriped在WSDL文件中的阿瑟賽德Web服務具有唯一的方法, 但該方法可能會隨時更改名稱,今天調用methodABC(),明天將更改爲methodDEFO()..

假設在JAVA中, 是否有無論如何,我可以動態生成Web服務客戶端,而無需手動手動執行?我的意思是當我的應用程序仍在運行時,動態生成客戶端。

或者我應該去看什麼樣的文章,因爲我從互聯網上做了很多搜索,找不到辦法做到這一點。 。我想我可能需要創建自己的框架來處理它..但不知道從哪裏開始。

回答

0

好,

有幾個問題要問這一個:

1:請問你的應用程序「瞭解」實際也就是改變名稱來在運行時方法的 ?

2 .:你在控制該網絡服務嗎?

3 .:您使用什麼框架進行WS通信?

+0

不...我無法控制別人..這就是爲什麼我想創建一個動態的客戶端發電機... 如果我可以控制另一端..我沒有這樣的問題。 .. 現在我使用的框架是asix2 – jojo 2009-09-08 15:10:16

+1

這是沒有用的。方法名稱更改後,存根很可能無法工作。是否有名稱更改的模式?即您的應用程序可以從新的wsdl中猜測實際的方法名稱是什麼? – KB22 2009-09-08 15:13:17

-1

通常wsdl是類似於消費者和主機之間的契約的文件。如果這將發生動態變化,則需要了解此更改的動態消耗情況,而不是動態地使用該服務。

+0

嗯...我沒有辦法...我必須使用該wsdl文件...... 我認爲應該有可能對我來說這樣做.. coz文件中的方法名已經定義在WSDL文件,數據類型也在WSDL文件中定義... 我從某處知道應該使用哪種方法調用哪種方法........ – jojo 2009-09-08 15:12:43

+0

All things像返回類型一樣,簽名和方法名稱都是用wsdl寫的。我問這個問題的觀點是,如果返回類型或簽名更改爲某個您沒有的對象,那麼您也需要生成它們,這將成爲另一個開銷。 如果您可以告訴確切的情況,可以達到更好的解決方案。 – Kalpak 2009-09-08 15:32:29

7

您可以使用任何WSDL-to-Java工具與Java Compiler API一起使用,將生成的類加載URLClassLoader,然後開始工作。相當多的工作,但不是很難,我會​​說。 (您可能會耗盡PermGen的空間,最終,雖然)。

但是,如果你的情況是現實的,最重要的問題將是如何生成的類,但爲什麼是Web服務的發佈者在破解?

編輯:澄清「on crack」thingie。更改Web服務的界面(例如方法名稱)意味着您必須猜想要調用哪個方法。如果在界面中只有一個方法,那麼確定要調用哪個方法並不難,但仍然 - 如果突然出現兩個方法會發生什麼?

更改外部系統使用的服務的界面是一件非常大的事情,不應掉以輕心。它絕對應該是自動化的。這是一種代碼味道,最有可能是無能,濫用藥物和/或純粹瘋狂的跡象。

我意識到我的道德化這樣並不能解決您的問題。我只希望你能說一個負責任的人理解一個不斷改變它的接口的Web服務是一種可憎的事情,並且改變它會比改寫代碼更好。

+1

'在破解',大聲笑 - 網絡服務必須成爲跆拳道的候選人,如果我見過一個... – 2009-09-08 15:24:25

+0

我很想+1這只是爲了評論。 :) – Powerlord 2009-09-08 15:24:38

+0

+1對於「破解」評論的震撼價值 – Federer 2010-03-09 15:11:51

0

這種WSDL動態更改的Web服務不適合生成客戶端綁定。

大多數Web服務堆棧都支持動態客戶端的概念,您可以通過靜態方式調用Web服務操作。

要挑選一個示例,請參閱Apache CXF dopcumentation的相關部分。

另一個例子是Spring-WS,它從來不使用WSDL生成的代碼,而是以XML文檔爲中心。如果您的Web服務具有高度可變性,那麼我會強烈推薦Spring-WS而不是更傳統的JAX-WS生成的客戶端。