Cần giúp đỡ với tình huống sau đây: Người dùng có thể tạo ra cấu trúc dữ liệu riêng của họ mà được lưu trữ như JAXB-ready nguồn XSD như dưới đây:làm thế nào để buộc schema biên soạn các lớp học để mở rộng lớp học cụ thể schema bên ngoài
<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>
Sau mới hoặc sơ đồ biến đổi xuất hiện nó sẽ tự động phân tích cú pháp bằng Schema trình biên dịch, nguồn java được tạo ra, biên soạn và đóng gói vào sử dụng lọ:
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
// ......
và mọi thứ đều ok cho đến khi nó đã quyết định rằng mọi tầng lớp người dùng tạo phải mở rộng một lớp học cụ thể đã biết, nói UserRootObject
:
package user.abc;
public class Group extends com.mycompany.xml.UserRootObject {
//
}
và
package user.abc;
public class Parameter extends com.mycompany.xml.UserRootObject {
//
}
Tất cả mọi thứ được khi đang bay, tôi không thể buộc người dùng chỉnh sửa file schema của họ, nhưng tôi có thể chuyển đổi chúng trước khi sang thế hệ mã. Có vẻ như tôi có hai tùy chọn để giới thiệu rằng UserRootObject
: bằng cách nào đó thông qua JCodeModel
hoặc bằng cách nào đó chuyển đổi tệp lược đồ trước khi tạo nguồn Java.
Cảm ơn! Có, tôi có thể chuyển đổi lược đồ theo cách đó nhưng làm thế nào để tôi nói với trình biên dịch lược đồ không tạo UserRootObject mà là 'làm cho tham chiếu' đến một lớp hiện có? Có thể ở tất cả? Điều đó sẽ tuyệt vời và giải quyết vấn đề. – Osw
Bạn đúng trong tiêu chuẩn JAXB đó không bao gồm trường hợp sử dụng này, nhưng XJC cung cấp điều này như là một phần mở rộng. Để biết thêm chi tiết, hãy xem: http://stackoverflow.com/questions/4556179/how-to-force-schema-compiled-classes-to-extend-specific-class-outside-schema/4607476#4607476 –