2011-08-24 69 views
19

我想限制這樣JAXB枚舉與數值

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

輸入值,但是這並不能產生一個枚舉。我懷疑這是因爲值以數字開頭,而Enum值不允許。

有沒有解決方法或解決方法?

回答

45

這裏是我的回答類似的問題,可以幫助(參見第2期):

有幾個導致此問題枚舉值。這些問題可以通過使用JAXB外部綁定文件來解決(見下文)。

枚舉問題#1 - 空字符串

你的一些枚舉值是空字符串(「」),這是造成一個字符串,而不是一個枚舉屬性產生:

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

枚舉問題#2 - 數字字符串

一些枚舉值的是這是造成一個字符串,而不是一個枚舉屬性被生成的數字:

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

綁定文件(bindings。XML)

以下綁定文件可用於解決問題與educationLevelType,這裏的概念可以適用於所有有問題的類型:

<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> 

的XJC調用可以製成如下(-nv標誌被下面描述):

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

這將導致產生以下枚舉:

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的問題

對於maxOccurs的問題,與以下命令行沒有驗證(-nv)標誌可以用來解析XML架構:

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

這會讓你通過以下錯誤而不必修改XML模式:

解析模式... [錯誤]當前 解析器的配置不支持 允許maxOccurs屬性值爲 的值設置爲大於值5,000。
line 41 of http://www.acf.hhs.gov/programs/cb/systems/nytd/nytd_data_file_format.xsd

無法解析模式。

更多信息

+1

你有你在示例中使用的XSD?鏈接http://www.acf.hhs.gov/programs/cb/systems/nytd/nytd_data_file_format.xsd不再可用。 –

5

是的。你可以自己定義枚舉而不是讓XJC生成枚舉。然後您可以指示XJC使用該枚舉。不過,你需要一個適配器類。

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 
    } 

} 

無論是在綁定文件或嵌入模式,自定義綁定像這樣:

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

MyEnumAdapter是默認的包在這裏,所以一定要使用完全合格的名稱時做這個你自己。