Ich arbeite an einer Anwendung, die XJC verwendet, um Java POJOs von XSDs zu generieren. Es gibt Dutzende von Schemas, und diese Zahl wird wachsen. Die Anwendung muss auch in der Lage sein, verschiedene Versionen desselben Schemas zu handhaben, was bedeutet, dass ich mehrere Schemata haben werde, die gängige Typen definieren. Ich versuche, die Bindungen so anzupassen, dass bestimmte Kerntypen eine gemeinsame Schnittstelle implementieren. Das Vererbungs-Plugin von JAXB2 Basics scheint zu tun, was ich brauche, aber ich kann nicht die richtige Syntax finden.JAXB generierte Klassen bestimmter Typen, die eine benutzerdefinierte Schnittstelle implementieren
Hier ist der relevante Teil meines Schema:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:my="http://example.com/core"
targetNamespace="http://example.com/core"
xmlns:xml="http://www.w3.org/XML/1998/namespace">
...
<xs:complexType name="addressType">
<xs:sequence>
<xs:element name="Address" type="xs:string"/>
<xs:element name="City" type="xs:string"/>
<xs:element name="Province" type="xs:string"/>
<xs:element name="Country" type="xs:string"/>
<xs:element name="County" type="xs:string" minOccurs="0"/>
<xs:element name="PostalCode" type="xs:string"/>
</xs:sequence>
</xs:complexType>
...
</xs:schema>
... und das ist, was Datei meine benutzerdefinierte Bindung wie folgt aussieht:
<?xml version="1.0"?>
<jaxb:bindings
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:inheritance="http://jaxb2-commons.dev.java.net/basic/inheritance"
xmlns:my="http://example.com/core"
jaxb:extensionBindingPrefixes="inheritance"
version="2.1">
<jaxb:bindings scd="x-schema::my" xmlns:my="http://example.com/core">
<jaxb:globalBindings localScoping="toplevel">
<jaxb:serializable/>
<xjc:simple/>
</jaxb:globalBindings>
<jaxb:bindings scd="/type::my:addressType">
<inheritance:implements>com.mysite.validator.ValidatableAddress</inheritance:implements>
<!--<xjc:superInterface name="com.mysite.validator.ValidatableAddress"/>-->
</jaxb:bindings>
</jaxb:bindings>
</jaxb:bindings>
ich die scd bin mit Ansatz , da in allen "traditionellen" Bindungsbeispielen, die zeigen, wie das inheritenz-plugin verwendet wird, schemaLocation angegeben wird. Ich möchte vermeiden, schemaLocation aufgrund unserer großen (und wachsenden) Anzahl von Schemas anzugeben. Ich möchte die Bindungsdatei nicht jedes Mal ändern müssen, wenn wir ein neues Schema hinzufügen. Also, scd scheint wie es diese Anforderung erfüllen wird.
Allerdings, wenn ich die Build unter Verwendung der oben Bindung laufen, bekomme ich diese:
[xjc] [ERROR] cvc-elt.1: Cannot find the declaration of element 'inheritance:implements'. [xjc] line 18 of file:/dev/workspace/my_app/etc/schemas/bindings-common.xml [xjc] failure in the XJC task. Use the Ant -verbose switch for more details [xjc] classLoader = [email protected] [xjc] SharedSecrets.getJavaNetAccess()[email protected]
Wenn ich das Erbe Kommentar aus: implementiert Linie und Kommentar- der xjc: Superschnitt Linie, der Fehler geht entfernt und der Build wird erfolgreich abgeschlossen, aber meine AddressType Klassen implementieren nicht den Typ ValidatableAddress.
Kann das inheritence-Plugin mit scd verwendet werden? Kann xjc: superInterface auf bestimmte Elemente beschränkt sein?
Prost.
Dank lexicore. Was ist mit der Kombination von scd und xjc: superInterface ... Sollte das funktionieren? Irgendeine Idee, warum dieser Ansatz keinen Fehler erzeugt, aber auch keine Auswirkung auf die generierte Quelle hat? – 6006604
... oder wird xjc: superInterface als benutzerdefinierte Anpassung/Anbieter-Anpassung betrachtet, genau wie inheritence: implements? – 6006604
Es ist eigentlich eine Erweiterung des Anbieters, aber es ist eine "erste Klasse" Vendor-Erweiterung, die speziell XJC bekannt ist (siehe [hier] (https://github.com/gf-metro/jaxb/blob/69471fb27af6a9e990ef2a7873aab64a18e87640/jaxb-ri/ xjc/src/main/resources/com/sun/tools/xjc/Leser/XmlSchema/bindinfo/binding.xsd # L81)) - im Gegensatz zu 'Vererbung: implements'. By the way, ist nicht 'xjc: superInterface' für [nur globale Bindungen] (https://jaxb.java.net/nonav/2.1.15/docs/vendorCustomisations.html#superinterface)? Würde erklären, warum es in der Klasse ignoriert wird. – lexicore