2009-02-25 31 views
8

Khi tạo Java từ một XSD qua trình biên dịch XJC, tôi luôn nhận được loại java.lang.String cho các yếu tố với simpleTypes vô danh như thế này:JAXB: Các loại đơn giản ẩn danh là enums?

<xsd:element name="Product"> 
    <xsd:simpleType> 
     <xsd:restriction base="xsd:string"> 
      <xsd:enumeration value="Product1"/> 
      <xsd:enumeration value="Product2"/> 
      <xsd:enumeration value="Product3"/> 
     </xsd:restriction> 
    </xsd:simpleType> 
</xsd:element> 

Tất nhiên, tôi muốn một điều tra cho việc này. Có cách nào để lừa XJC tạo ra và sử dụng nó?

Chúng tôi đang sử dụng JAXB 2.1.3. Lưu ý: trước khi bạn yêu cầu, không, tôi không thể thay đổi giản đồ và sửa nó thành lỗi của XJC.

Trả lời

14

Bạn cần phải đưa vào XJC tập tin của bạn:

<jxb:bindings node="//xsd:element[@name='Product']/xsd:simpleType"> 
    <jxb:typesafeEnumClass name="ProductType" /> 
</jxb:bindings> 

hoặc

<jxb:bindings node="//xsd:element[@name='Produkt']"> 
    <jxb:bindings node="./xsd:simpleType"> 
     <jxb:typesafeEnumClass name="ProduktType" /> 
    </jxb:bindings> 
</jxb:bindings> 
1

Tôi có một câu hỏi rất giống nhau, tôi hỏi trên mailing list JAXB và có this fairly helpful response (đã không có thời gian để thử nó ra mặc dù)

chỉnh sửa: nếu bạn đang nói về tự động tạo ra các lớp enum, thay vì chỉ tự động ánh xạ tới một lớp enum mà bạn tự viết, tôi sẽ nghĩ rằng bạn có thể viết một lớp java sẽ phân tích cú pháp tệp lược đồ và tự động tạo mã java cho liệt kê đó. (Sau đó chạy mà lớp java bất cứ khi nào bạn gọi XJC)

+0

tôi quản lý để làm điều này mà không cần xác định kiểu enum của riêng tôi - xem câu trả lời của tôi. –

+0

Liên kết của bạn bị hỏng. –

+0

đã sửa nó, cảm ơn. –

5

Dưới đây là một ví dụ về cách tôi thực hiện điều này. Tôi sẽ thêm toàn bộ xjb cho đầy đủ kể từ khi tôi thừa nhận xem xét các ví dụ hiện tại tôi vẫn thấy nó hơi khó hiểu.

Here's file .xjb

<?xml version="1.0" encoding="UTF-8"?> 
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema" 
       jaxb:version="1.0"> 
    <jaxb:bindings schemaLocation="search-constraints.xsd" 
    node="/xs:schema"> 

    <jaxb:bindings node="//xs:simpleType[@name='booleanStringType']"> 
     <jaxb:typesafeEnumClass name="BooleanStringType" /> 
    </jaxb:bindings> 

    </jaxb:bindings> 
</jaxb:bindings> 

Ở đây, các ràng buộc tham khảo với các loại đơn giản của tôi được công bố ở mức gốc trong tôi tìm kiếm constraints.xsd. Dưới đây là một trích tập tin đó:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
targetNamespace="http://www.example.com" 
xmlns:tns="http://www.example.com" 
elementFormDefault="qualified" 
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
    jaxb:version="1.0"> 

... 


<xs:simpleType name="booleanStringType"> 
    <xs:restriction base="xs:string"> 
     <xs:enumeration value="true" /> 
     <xs:enumeration value="false" /> 
    </xs:restriction> 
</xs:simpleType> 

Các vấn đề liên quan