我想限制像这样的输入值
<simpleType name="SomeCode">
<restriction base="string">
<enumeration value="036222B"/>
<enumeration value="036111C"/>
</restriction>
</simpleType>
但这不会产生枚举。我怀疑这是因为值以数字开头,而且Enum值不允许这样做。
有任何解决方案或解决方法吗?
答案 0 :(得分:45)
以下是我对类似问题的回答(见问题2):
有几个枚举值导致此问题。通过使用JAXB外部绑定文件可以克服这些问题(见下文)。
枚举问题#1 - 空字符串
你的一些枚举值是空字符串(“”),它导致生成一个String而不是一个枚举属性:
<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问题,可以使用以下带有 no verify ( - nv)标志的命令行来解析XML模式:
xjc -nv -d out http://www.acf.hhs.gov/programs/cb/systems/nytd/nytd_data_file_format.xsd
这将使您无需修改XML架构即可通过以下错误:
解析模式... [ERROR]当前 解析器的配置没有 允许maxOccurs属性值 设置大于值5,000 第41行 http://www.acf.hhs.gov/programs/cb/systems/nytd/nytd_data_file_format.xsd
无法解析架构。
了解更多信息
答案 1 :(得分: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在此处是默认包中,因此请确保在自己执行此操作时使用完全限定名称。
答案 2 :(得分:2)
这段代码更简单,对我有用。
@XmlEnum(value = Integer.class)
public enum SomeEnum {
@XmlEnumValue("0")
Value1,
@XmlEnumValue("1")
Value2,
@XmlEnumValue("2")
Value3;
}