2010-11-25 8 views
5

Ich habe die folgende Situation:JAXB xsd: enthalten und separate Pakete

Es gibt 2 xsd-Dateien. Die erste definiert ein Wurzelelement und mehrere Typen.

Der zweite enthält den ersten und erweitert einen der Typen. Dort ist kein Root-Typ in dieser Datei definiert.

Von der ersten xsd wird ein Modell in einem Paket generiert (a). Das zweite Schema sollte ein neues Paket (b) für die zusätzlichen Typen erstellen, aber das generierte Paket wiederverwenden. Ich löste dies, indem ich eine Bindungsdatei verwendete, die auf die vorher erzeugten Elemente zeigt (in Paket a). Bis jetzt funktioniert das, aber ..

JAXB erzeugt eine ObjectFactory in Paket A, das eine Erstellungsmethode für das Stammelement enthält. Für das zweite Schema wird auch eine ObjectFactory in Paket B erstellt. Und diese Klasse hatte auch die create-Methode für dasselbe Wurzelelement.

Um alle Typen verwenden zu können, wird der jaxb-Kontext mit mehreren Objektfactories (newInstance(a.ObjectFactory.class, b.ObjectFactory.class)) erstellt.

Zur Laufzeit führt dies zu dem folgenden Fehler:

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

Soll ich die Pakete anders generieren? Oder gibt es etwas möglich mit der Bindungsdatei, um die Objektfabrik von mit doppelten Methoden zu verhindern?

Antwort

6

Zunächst ist es wichtig zu verstehen, dass wenn Sie xsd:include anstelle von xsd:import verwenden, Sie nicht zwei verschiedene Schemas haben. Es ist ein Schema in mehreren Dateien und kompiliert es in mehreren Paketen, und JAXB zu tricksen, um diese Pakete zu kombinieren, sieht mehr wie hacken aus.

Also mein primärer Vorschlag wäre, stattdessen xsd:import zu verwenden und separate schema compilation Ansatz zu betrachten.

Wenn Sie mit xsd:include bleiben wollen, müssen Sie JAXB tricksen. Sie können beispielsweise eine (oder beide) der Klassen ObjectFactory entfernen oder optimieren und Ihren JAXB-Kontext basierend auf einzelnen Klassen anstelle von Objektfabriken erstellen. Sie können auch jaxb.index anstelle von Objektfabriken verwenden. Aber es ist alles Hacking.

+0

Danke für die Antwort. Ich habe es bereits geändert, um Import anstelle von Include zu verwenden, scheint in der Tat besser zu sein. Ich schaue mir den Blogpost an, scheint bisher vielversprechend. – Alexander

+0

Das hat mein Problem gelöst. Danke für den Link, ich habe seit Tagen gesucht. : S – Alexander

+1

Verwendung von Import anstelle von Include konnte für diesen speziellen Fall funktioniert haben, aber das exakt gleiche Problem mit der ObjectFactory, die doppelte Methoden enthält, kann auch beim Import angezeigt werden (wenn Objektreferenzen verwendet werden). Siehe: http://stackoverflow.com/questions/5155414/jaxb-multiple-schemas-with-element-reference –

Verwandte Themen