2009-12-10 52 views
17

我有一個現有的XML模式,其中包含我想使用JAXB映射到某種Java Map的類型。我的構建過程需要模式並創建bean。我想通過將我的模式中的其中一個complexType映射到java.util.Map來自定義此過程。我讀過JAXB「不能做接口」的地方。我不確定在這種情況下是否適用,但如果是這樣的話,我會很好地將它映射到HashMap。此外,它不一定是映射到Map的complexType,如果這是必需的,它可能是一個元素。是否可以使用JAXB從模式映射到java.util.Map?

我使用.xjb文件控制我的JAXB代,所以我正在尋找一些<jaxb:bindings>放在那裏。我試過以下,但它不工作:

<jaxb:bindings schemaLocation="myschema.xsd" node="/xs:schema"> 
    <jaxb:globalBindings> 
     <jaxb:serializable uid="1"/> 
    </jaxb:globalBindings> 
    <jaxb:schemaBindings> 
     <jaxb:package name="com.myschema.client.types"/> 
    </jaxb:schemaBindings> 
    <jaxb:bindings node="//xs:complexType[@name='MapType']"> 
      <jaxb:javaType name="java.util.HashMap" 
      parseMethod="com.myschema.common.MapConverter.parseObjectToMap" 
      printMethod="com.myschema.common.MapConverter.printMapToObject" /> 
    </jaxb:bindings> 
</jaxb:bindings> 

編輯:我已經添加上述結合,我已經嘗試更多的細節。它架構在編譯生成以下錯誤:

[jaxb] [ERROR] compiler was unable to honor this javaType customization. It is attached to a wrong place, or its inconsistent with other bindings. 

<jaxb:javaType>不會工作,因爲它只能用於mapping between XML Schema primitives and Java types。由於我想在複雜類型和Java類型之間進行映射,所以我不能使用它。

+0

你的'.xjb'方法是正確的,應該可以工作。 XJC是否忽略了它,還是它產生了錯誤的東西? – skaffman 2009-12-11 08:46:10

+0

使用上面的.xjb方法,我在我的jaxb編譯中得到以下錯誤: [jaxb] [錯誤]編譯器無法兌現此javaType自定義。它附屬於錯誤的地方,或與其他綁定不一致。 – Zach 2009-12-11 13:44:58

回答

10

您的XJC文件正在使用「標準」javaType指令,我認爲該指令僅限於將字符串值轉換爲代表性Java類型以及從中代表Java類型。因此,它僅適用於轉換簡單的元素和屬性內容。

XJC工具提供了javaType的增強版本,理論上它應該能夠處理更復雜的結構。不幸的是,這尚未得到執行:

https://java.net/jira/browse/JAXB-209(未解決)

舉例來說,能夠到 模式類型映射到一個HashMap可能是使用 模型驅動設計的一個 可能要求/執行。 AFAICS,這是今天不可能的。 因此,您必須手動編輯生成的代碼 。

看起來像你運氣不好。

+0

我希望這不會是答案,很高興知道我沒有失去任何東西。 – Zach 2009-12-11 21:16:03

6

有你看着這裏的例子(自定義HashMap的映射): http://java.sun.com/javase/6/docs/api/javax/xml/bind/annotation/adapters/XmlAdapter.html

需要創建自定義XmlAdapter我害怕。

+1

嘿,這看起來很接近我想要做的!唯一的是,我使用模式來生成Java類型(作爲我的構建過程的一部分)。我不介意編寫適配器,但我想避免必須預先實現生成架構的類(在鏈接示例中爲MyHashMapTypeMyHashMapEntryType),因爲這對我來說是倒退了。這可能嗎? – Zach 2009-12-10 21:18:14

+0

我不認爲這是嚴格必要的,很可能它只是擴展的例子。我知道我們過去只使用模式,綁定自定義文件和適配器。 – maximdim 2009-12-10 22:14:37

+0

聽起來像JSON ... – duffymo 2009-12-10 23:49:14

相關問題