我想限制這樣JAXB枚舉與數值
<simpleType name="SomeCode">
<restriction base="string">
<enumeration value="036222B"/>
<enumeration value="036111C"/>
</restriction>
</simpleType>
輸入值,但是這並不能產生一個枚舉。我懷疑這是因爲值以數字開頭,而Enum值不允許。
有沒有解決方法或解決方法?
我想限制這樣JAXB枚舉與數值
<simpleType name="SomeCode">
<restriction base="string">
<enumeration value="036222B"/>
<enumeration value="036111C"/>
</restriction>
</simpleType>
輸入值,但是這並不能產生一個枚舉。我懷疑這是因爲值以數字開頭,而Enum值不允許。
有沒有解決方法或解決方法?
這裏是我的回答類似的問題,可以幫助(參見第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無法解析模式。
更多信息
是的。你可以自己定義枚舉而不是讓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是默認的包在這裏,所以一定要使用完全合格的名稱時做這個你自己。
你有你在示例中使用的XSD?鏈接http://www.acf.hhs.gov/programs/cb/systems/nytd/nytd_data_file_format.xsd不再可用。 –