mit folgenden Situation Brauchen Sie Hilfe: Benutzer können ihre eigenen Datenstrukturen erzeugen, die im Folgenden als JAXB-ready XSD Quellen wie gespeichert werden:wie Schema kompilierten Klassen erzwingen außerhalb Schema spezifische Klasse erweitern
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Group" type="Group"/>
<xs:element name="Parameter" type="Parameter"/>
<xs:complexType name="Group">
<xs:sequence>
<xs:element name="caption" type="xs:string" minOccurs="0"/>
<xs:element name="parameters" type="Parameter" nillable="true" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Parameter">
<xs:sequence>
<xs:element name="key" type="xs:string" minOccurs="0"/>
<xs:element name="group" type="Group" minOccurs="0"/>
<xs:element name="value" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
Nach neuem oder modifizierte Schema erscheint es automatisch von Schema-Compiler, java Quellen analysiert wird, erzeugt wird, kompiliert und in Benutzer Gläser verpackt:
SchemaCompiler sc = XJC.createSchemaCompiler();
// Input source for schema
InputSource is = new InputSource(new StringInputStream(objectPackage.getObjectSchema()));
// Parse
sc.parseSchema(is);
S2JJAXBModel model = sc.bind();
// Generate source
JCodeModel jCodeModel = model.generateCode(null, null);
jCodeModel.build(packageSourceDirectory);
// Compile and package
// ......
und alles war in Ordnung, bis es wurde beschlossen, dass alle Benutzer-generierten Klassen erweitern müssen eine bestimmte bekannte Klasse, sagt UserRootObject
:
package user.abc;
public class Group extends com.mycompany.xml.UserRootObject {
//
}
und
package user.abc;
public class Parameter extends com.mycompany.xml.UserRootObject {
//
}
Alles on the fly ist, kann ich nicht Benutzer zwingen kann, ihre Schema-Dateien zu ändern, aber ich kann sie Generation vor Code umwandeln. Sieht so aus, als hätte ich zwei Möglichkeiten, um das UserRootObject
einzuführen: Irgendwie über JCodeModel
oder irgendwie Transformieren von Schemadateien vor dem Erstellen von Java-Quellen.
Dank! Ja, ich könnte das Schema auf diese Weise transformieren, aber wie kann ich dem Schema-Compiler mitteilen, dass er UserRootObject nicht erzeugen, sondern auf eine existierende Klasse verweisen soll? Ist es überhaupt möglich? Das wäre großartig und löse das Problem. – Osw
Sie haben Recht, dass der Standard JAXB diesen Anwendungsfall nicht behandelt, aber XJC bietet dies als Erweiterung an. Für weitere Details siehe: http://StackOverflow.com/Questions/4556179/how-to-force-schema-compiled-Classes-to-Extend-Specific-Class-Outside-Schema/4607476#4607476 –