2011-08-24 40 views
19

Tôi muốn hạn chế giá trị đầu vào như thế nàyJAXB liệt kê với giá trị số

<simpleType name="SomeCode"> 
    <restriction base="string"> 
    <enumeration value="036222B"/> 
    <enumeration value="036111C"/> 
    </restriction> 
</simpleType> 

Nhưng điều này không tạo ra một Enum. Tôi nghi ngờ đó là vì các giá trị bắt đầu bằng các số và điều này không được phép cho các giá trị Enum.

Có giải pháp hoặc giải pháp nào khác không?

Trả lời

45

Dưới đây là câu trả lời của tôi đến một câu hỏi tương tự có thể giúp (xem vấn đề 2):

Có một vài giá trị liệt kê đang gây ra vấn đề này. Những vấn đề này có thể được khắc phục thông qua việc sử dụng tệp đính kèm bên ngoài JAXB (xem bên dưới).

Enum Issue # 1 - Rỗng Chuỗi

Một số giá trị enum của bạn là chuỗi rỗng (""), được gây ra một chuỗi chứ không phải là một tài sản enum được tạo ra:

<xs:enumeration value=""> 
    <xs:annotation> 
     <xs:documentation>Blank</xs:documentation> 
    </xs:annotation> 
</xs:enumeration> 

Vấn đề Enum # 2 - Chuỗi số

Một số giá trị enum là các số gây ra chuỗi thay vì một thuộc tính enum được tạo:

<xs:enumeration value="6"> 
    <xs:annotation> 
     <xs:documentation>6th grade</xs:documentation> 
    </xs:annotation> 
</xs:enumeration> 

Tệp kết buộc (ràng buộc).xml)

File bindings sau đây có thể được sử dụng để giải quyết các vấn đề với educationLevelType, các khái niệm ở đây có thể được áp dụng cho tất cả các loại vấn đề:

<jxb:bindings 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
    version="2.1"> 
    <jxb:bindings schemaLocation="http://www.acf.hhs.gov/programs/cb/systems/nytd/nytd_data_file_format.xsd"> 
     <jxb:bindings node="//xs:simpleType[@name='educationLevelType']/xs:restriction/xs:enumeration[@value='6']"> 
      <jxb:typesafeEnumMember name="SIX"/> 
     </jxb:bindings> 
     <jxb:bindings node="//xs:simpleType[@name='educationLevelType']/xs:restriction/xs:enumeration[@value='7']"> 
      <jxb:typesafeEnumMember name="SEVEN"/> 
     </jxb:bindings> 
     <jxb:bindings node="//xs:simpleType[@name='educationLevelType']/xs:restriction/xs:enumeration[@value='8']"> 
      <jxb:typesafeEnumMember name="EIGHT"/> 
     </jxb:bindings> 
     <jxb:bindings node="//xs:simpleType[@name='educationLevelType']/xs:restriction/xs:enumeration[@value='9']"> 
      <jxb:typesafeEnumMember name="NINE"/> 
     </jxb:bindings> 
     <jxb:bindings node="//xs:simpleType[@name='educationLevelType']/xs:restriction/xs:enumeration[@value='10']"> 
      <jxb:typesafeEnumMember name="TEN"/> 
     </jxb:bindings> 
     <jxb:bindings node="//xs:simpleType[@name='educationLevelType']/xs:restriction/xs:enumeration[@value='11']"> 
      <jxb:typesafeEnumMember name="ELEVEN"/> 
     </jxb:bindings> 
     <jxb:bindings node="//xs:simpleType[@name='educationLevelType']/xs:restriction/xs:enumeration[@value='12']"> 
      <jxb:typesafeEnumMember name="TWELVE"/> 
     </jxb:bindings> 
     <jxb:bindings node="//xs:simpleType[@name='educationLevelType']/xs:restriction/xs:enumeration[@value='']"> 
      <jxb:typesafeEnumMember name="BLANK"/> 
     </jxb:bindings> 
    </jxb:bindings> 
</jxb:bindings> 

Cuộc gọi XJC có thể được thực hiện như sau (cờ -nv được mô tả dưới đây):

xjc -nv -b bindings.xml -d out http://www.acf.hhs.gov/programs/cb/systems/nytd/nytd_data_file_format.xsd 

này sẽ làm cho Enum sau để được tạo ra:

package gov.hhs.acf.nytd; 

import javax.xml.bind.annotation.XmlEnum; 
import javax.xml.bind.annotation.XmlEnumValue; 
import javax.xml.bind.annotation.XmlType; 

@XmlType(name = "educationLevelType") 
@XmlEnum 
public enum EducationLevelType { 

    @XmlEnumValue("under 6") 
    UNDER_6("under 6"), 

    @XmlEnumValue("6") 
    SIX("6"), 

    @XmlEnumValue("7") 
    SEVEN("7"), 

    @XmlEnumValue("8") 
    EIGHT("8"), 

    @XmlEnumValue("9") 
    NINE("9"), 

    @XmlEnumValue("10") 
    TEN("10"), 

    @XmlEnumValue("11") 
    ELEVEN("11"), 

    @XmlEnumValue("12") 
    TWELVE("12"), 

    @XmlEnumValue("post secondary") 
    POST_SECONDARY("post secondary"), 

    @XmlEnumValue("college") 
    COLLEGE("college"), 
    @XmlEnumValue("") 

    BLANK(""); 
    private final String value; 

    EducationLevelType(String v) { 
     value = v; 
    } 

    public String value() { 
     return value; 
    } 

    public static EducationLevelType fromValue(String v) { 
     for (EducationLevelType c: EducationLevelType.values()) { 
      if (c.value.equals(v)) { 
       return c; 
      } 
     } 
     throw new IllegalArgumentException(v); 
    } 

} 

maxOccurs Issue

Đối với vấn đề maxOccurs, dòng lệnh sau đây với không xác minh (-nv) cờ có thể được sử dụng để phân tích các lược đồ XML:

xjc -nv -d out http://www.acf.hhs.gov/programs/cb/systems/nytd/nytd_data_file_format.xsd 

này sẽ giúp bạn vượt qua lỗi sau mà không phải sửa đổi lược đồ XML:

phân tích cú pháp lược đồ ... [ERROR] Cấu hình hiện tại của trình phân tích cú pháp không cho phép giá trị thuộc tính maxOccurs thành được đặt lớn hơn giá trị 5.000.
dòng 41 của http://www.acf.hhs.gov/programs/cb/systems/nytd/nytd_data_file_format.xsd

Không phân tích được lược đồ.

Để biết thêm thông tin

+1

Bạn có XSD mà bạn sử dụng trong ví dụ? Liên kết http://www.acf.hhs.gov/programs/cb/systems/nytd/nytd_data_file_format.xsd không còn khả dụng nữa. –

5

Có. Bạn có thể tự xác định enum thay vì XJC tạo ra nó. Sau đó, bạn có thể hướng dẫn XJC sử dụng enum đó. Tuy nhiên, bạn sẽ cần một lớp bộ điều hợp.

import acme.MyEnum; 

public class MyEnumadapter { 

    public static MyEnum unmarshal(final String value) { 
     if(value == null) 
      return null; 
     //use some method to identify the enum by the value and return 
    } 

    public static String marshal(final MyEnum value) { 
     if (value == null) 
      return null; 
     //use some method to get the value for the enum 
    } 

} 

Hoặc trong một file bindings hoặc nhúng vào trong lược đồ, tùy chỉnh các ràng buộc như thế này:

<bindings node="//xs:simpleType[@name='SomeCode']"> 
    <javaType name="acme.MyEnum" 
     parseMethod="MyEnumAdapter.unmarshal" 
     printMethod="MyEnumAdapter.marshal"/> 
</bindings> 

MyEnumAdapter là trong gói mặc định ở đây, do đó hãy chắc chắn rằng bạn sử dụng tên đầy đủ khi thực hiện chính bạn.

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