2010-04-19 103 views
17

我必須從Java應用程序使用.NET託管的Web服務。兩者之間的互操作性通常非常好。我遇到的問題是.NET應用程序開發人員選擇使用.NET DataSet對象公開數據。有很多寫,爲什麼你不應該這樣做,文章如何使互操作性困難:解析從Java .NET Web服務返回的.NET數據集

我的問題是,儘管這不是被推薦的做法,但我堅持不得不使用返回帶有Java的DataSet的Web服務。當你產生這樣的事情的代理有什麼比.NET你基本上與物體看起來像這樣結束了其他:

@XmlElement(namespace = "http://www.w3.org/2001/XMLSchema", required = true) 
    protected Schema schema; 
    @XmlAnyElement(lax = true) 
    protected Object any; 

這第一場是應該描述DataSet中的實際模式。當我使用Java中的JAX-WS和JAXB處理時,它將所有的XS-Schema作爲Java對象呈現在此處。走JAXB的對象樹是可能的,但並不美觀。 any字段表示模式指定的模式中的DataSet的原始XML。

數據集的結構非常一致,但數據類型確實發生了變化。我需要訪問類型信息,架構因呼叫而異。我雖然有幾個選擇,但沒有一個看起來像'好'選項。

  • 嘗試在運行時使用JAXB從模式生成Java對象似乎是一個壞主意。這會太慢,因爲它需要每次都發生。
  • 蠻力行走使用JAXB架構樹對象是JAX-WS帶進來。
  • 也許不是使用JAXB解析的模式會更容易對付它的XML和使用XPath的嘗試和發現我需要的類型信息。

我還沒有考慮過其他選擇嗎?是否有一個Java庫輕鬆解析DataSet對象?其他人做了什麼,可能會有類似的情況?

回答

9

不幸的是,我不認爲這裏有一個簡單的答案。我會做的是在.NET中創建一個代理Web服務,您可以從Java調用接收數據集,將其轉換爲更易於使用的東西,然後將其返回給您的Java代碼。

+0

請讓我知道你是否有任何嘗試, – 2013-04-04 07:43:49

3

您的Java應用程序是否在服務器上運行?如果是這樣,請在服務器上安裝Mono,並使用Mono中內置的ADO.NET將數據集轉換爲Java可以理解的內容。好處是所有對數據集的解釋都是在Mono中完成的。你甚至可以使用IKVM來留在Java語言世界。無論如何,在Mono世界中,您可以擁有一個可以進行轉換的本地服務,或者只是具有一個將數據集轉換爲Java可以理解的格式的文件系統的實用程序。

+0

好的開箱思維。 – 2010-04-29 16:49:14

+0

在開箱時聽到總是很高興:) – zumalifeguard 2010-05-06 23:02:33

+0

請讓我知道你是否有任何人嘗試過, – 2013-04-04 07:43:10

1

您是否考慮過在返回的原始XML上使用XSLT來將它按摩到可以更容易處理的東西?

我已經用這種方法來複雜的返回值轉換成類似的東西

<ops> 
    <set name="foo" value="bar"/> 
    <set name="foo2" value="bar2" /> 
    .... 
</ops> 

這使邏輯到適合於處理XML,而不是在Java中handcoding它的語言。

+0

請讓我知道你是否有任何人嘗試過, – 2013-04-04 07:42:35