2010-08-12 105 views
0

我必須爲一組Web服務提供接口,爲此我已生成代碼存根和對象綁定。許多事務共享一個通用的對象模型,因此大部分生成的代碼重疊。通常這不會成爲問題,因爲我只是重複使用相同的代碼,因爲wsdl會鏈接相同的xsd文件。如何同時使用同一類的不同版本

不幸的是,這些服務的提供者已經將xsd分開,以便每個服務綁定到相同文件的單獨集(基本上是副本)。在他們的規範中,他們聲明客戶端的實現應該隔離每個Web服務以便於維護。基本上,他們希望能夠修改單個Web服務的xsd,同時保持所有其他服務器不變。

的問題如下:

我怎麼能在同一程序中,使每個服務暴露了他們的功能,而與他們的弟兄干擾整合這些不同的組生成的類的?

我認爲的一個解決方案是爲每個解決方案創建一個外觀,以展示所需的功能和對象模型,以便實際實現保持隱藏狀態。然後,巧妙地使用自定義類加載器的每個外觀將加載包含此特定服務的生成代碼的特定jar。

有沒有想法?想法?你遇到類似問題的經歷是什麼?

謝謝

回答

1

一般來說,最簡單的方法是使用jaxb綁定文件(或CXF的wsdl2java工具的-p參數)將生成的代碼映射到特定服務的特定包中。因此,每個服務都有它自己的對象來處理。

如果您必須整合各種服務,複雜性將會出現。就像從一個回到另一個。由於對象將完全不同,因此您需要編寫代碼以將數據從一個複製到另一個。可能不好玩。 :-(

+0

是的,這是我最終做的,通過挖掘更多的Codegen選項,我偶然發現了這種可能性。雖然不是問題的直接解決方案,但確實提供瞭解決問題的簡單而安全的方法。 – Newtopian 2010-08-12 19:14:48

2

您是否考慮過使用基於OSGi的軟件包(例如Eclipse Equinox運行時)?使用基於OSGi的實現,每組生成的類都將位於一個單獨的包(.jar文件)中,該包可以獲得自己的類加載器,並可以將其部分API有選擇地導出到應用程序的其餘部分。因此,它提供了您提出的解決方案的現成實施。

+0

的確,OSGi會非常適合這個目的,謝謝你的建議。然而,考慮到這個特定的設置,我使用了一個簡單的解決方案,讓生成器將代碼放在單獨的包中,從而解決問題而不是通過它。 – Newtopian 2010-08-12 19:10:48

0

對於Java,當兩個類由不同的類加載器加載時,兩個類彼此不同,您可以利用這兩個類自己從兩個URLClassLoaders中加載這兩個類,它們將各個jar的URL作爲classpath中。你可能不需要建2個門面,如果對象的兩組實現相同的接口。

更新

是,罐子不應該在主應用程序的classpath中。如果您設置了主應用程序的類加載器作爲URLClassLoaders的父類,所加載的類仍然可以訪問其餘的類spath你的應用程序使用。

對於static如果它們是常量,它們可能會被編譯器內聯。對於靜態變量,您將獲得2,1加載的每個jar。如果這些變量在罐子上下文之外使用,您可能需要通過反射它們的類對象來訪問它們。無論你需要選擇一個還是另一個都取決於應用程序,我的猜測是,如果你可以在1個應用程序中加載和使用2個版本,那麼任何靜態變量只能用在各個jar的上下文中。

+0

爲此工作我想我將不得不從應用程序的主要類路徑,以便他們不自動加載隔離罐子。然而,靜態成員和變量仍然存在問題,仍然可能會發生衝突。 – Newtopian 2010-08-12 19:13:19

+0

@Newtopian,查看更新。 – rsp 2010-08-12 20:39:14

相關問題