potrzebujesz pomocy w następującej sytuacji: Użytkownicy mogą generować własne struktury danych, które są przechowywane jako JAXB gotowe źródła XSD jak poniżej:jak zmusić klas schematu opracowano rozszerzenie konkretnej klasy poza schemat
<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>
Po nowy lub zmodyfikowany schemat pojawia się ona automatycznie analizowany przez kompilator, źródeł java schema jest generowany, opracowany i pakowane w słoiki użytkowniczki:
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
// ......
i wszystko było w porządku, dopóki nie zdecydowano, że wszystkie klasy generowane przez użytkownika muszą rozciągać jeden konkretny znanej klasy, powiedzmy UserRootObject
:
package user.abc;
public class Group extends com.mycompany.xml.UserRootObject {
//
}
i
package user.abc;
public class Parameter extends com.mycompany.xml.UserRootObject {
//
}
Wszystko jest na bieżąco, nie mogę zmusić użytkowników do modyfikacji plików schematu, ale mogę przekształcić je przed generowania kodu. Wygląda na to, że mam dwie możliwości wprowadzenia tego UserRootObject
: w jakiś sposób poprzez JCodeModel
lub jakoś transformacji plików schematu przed budowaniem źródeł Java.
Dzięki! Tak, mógłbym zmienić schemat w ten sposób, ale jak mogę powiedzieć kompilatorowi schematu, aby nie generował UserRootObject, ale raczej "odwoływał się" do istniejącej klasy? Czy to w ogóle możliwe? Byłoby świetnie i rozwiązało problem. – Osw
Masz rację w tym standardzie JAXB nie obejmuje tego przypadku użycia, ale XJC oferuje to jako rozszerzenie. Aby uzyskać więcej informacji, zobacz: http://stackoverflow.com/questions/4556179/how-to-force-schema-compiled-classes-to-extend-specific-class-outside-schema/4607476#4607476 –