necesita ayuda con la siguiente situación: Los usuarios pueden generar sus propias estructuras de datos que se almacenan como JAXB listo fuentes XSD, como a continuación:cómo forzar clases de esquema compilado para extender clase específica de esquema fuera
<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>
Después nueva o esquema modificado parece que se analiza automáticamente por el compilador de esquema, las fuentes de Java que se genera, compilado y empaquetado en frascos de usuario:
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
// ......
y todo estaba bien hasta que se decidió que todas las clases generadas por los usuarios deben extenderse una clase específica conocida, por ejemplo UserRootObject
:
package user.abc;
public class Group extends com.mycompany.xml.UserRootObject {
//
}
y
package user.abc;
public class Parameter extends com.mycompany.xml.UserRootObject {
//
}
Todo está sobre la marcha, no puedo obligar a los usuarios a modificar sus archivos de esquema pero puedo transformarlos antes de la generación de código. Parece que tengo dos opciones para introducir ese UserRootObject
: de alguna manera a través de JCodeModel
o de alguna manera transformar los archivos de esquema antes de compilar las fuentes de Java.
Gracias! Sí, podría transformar el esquema de esa manera, pero ¿cómo le digo al compilador de esquemas que no genere UserRootObject sino que 'haga referencia' a una clase existente? ¿Es posible? Eso sería genial y resolver el problema. – Osw
Está en lo correcto en ese estándar. JAXB no cubre este caso de uso, pero XJC ofrece esto como una extensión. Para obtener más información, consulte: http://stackoverflow.com/questions/4556179/how-to-force-schema-compiled-classes-to-extend-specific-class-outside-schema/4607476#4607476 –