2010-11-25 54 views
5

我有以下情況:JAXB xsd:包含並單獨包

有2個xsd文件。第一個定義了一個根元素和幾種類型。

第二個包含第一個,並擴展其中的一個類型。 在這個文件中沒有定義根類型。

從第一個xsd開始,在包(a)中生成一個模型。 第二個模式應爲其他 類型創建新包(b),但重用生成的包a。我通過使用指向先前生成的元素的 綁定文件(在 軟件包a中)解決了這個問題。 到目前爲止,這工作,但..

JAXB在包A中生成一個ObjectFactory,其中包含一個創建 方法的根元素。 對於第二個模式,還在包B中創建了一個ObjectFactory。 而且此類也具有相同根元素的create方法。

爲了能夠使用所有類型,使用 多個對象工廠(newInstance(a.ObjectFactory.class, b.ObjectFactory.class))創建jaxb上下文。

在運行時,這會導致以下錯誤:

com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions The element name {http://www.example.org/Scenario/}scenario has more than one mapping

我應該產生不同的包?或者有什麼 可能使用綁定文件來防止對象工廠從 有重複的方法?

回答

6

首先,重要的是要明白,如果您使用xsd:include而不是xsd:import,則沒有兩種不同的模式。它是幾個文件中的一個模式,並將其編譯爲多個包,並誘使JAXB將這些包合併在一起看起來更像是黑客行爲。

所以我的主要建議是使用xsd:import,而不是考慮separate schema compilation的方法。

如果你想留在xsd:include,你必須欺騙JAXB。例如,您可以刪除或調整ObjectFactory類中的一個(或兩者),並根據各個類而不是對象工廠構建JAXB上下文。您也可以使用jaxb.index代替對象工廠。但這都是黑客行爲。

+0

感謝您的回覆。我已經改變它使用導入,而不是包含,確實似乎更好。我會看看博客文章,看起來很有希望。 – Alexander 2010-11-25 13:49:34