2011-08-24 67 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是默认的包在这里,所以一定要使用完全合格的名称时做这个你自己。