簡體   English   中英

JAXB 枚舉生成為 VALUE_1 而不是 XSD 字符串名稱

[英]JAXB Enum Generating as VALUE_1 Instead of XSD String Names

我有一個 XSD 文件

<xsd:simpleType name="FieldName">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value=" " />
            <xsd:enumeration value="COMMON_NAME" />
            <xsd:enumeration value="IP_ADDRESS" />
            <xsd:enumeration value="ORIGINAL_ID" />
            <xsd:enumeration value="SITE_NAME" />
        </xsd:restriction>
    </xsd:simpleType>

生成的 JAXB class 有點奇怪,因為它生成的字段值為

@XmlEnumValue("COMMON_NAME")
VALUE_1("COMMON_NAME"),
@XmlEnumValue("IP_ADDRESS")
VALUE_2("IP_ADDRESS"),
.
.
and so on.

綁定 xjb 文件(某些屬性或其他東西)中是否有一種方法可以使其使用字符串名稱而不是通用的“VALUE_1”生成。 這是一個較小的示例,其中還有一個包含 300 多個值的枚舉,這是一個外部 XSD(由我們組織中的其他團隊擁有)。 所以我不能只輸入 go 並修改 XSD。

任何指針將不勝感激。

最有可能的是,從其中一個值不能轉換為 Java 枚舉常量名稱的那一刻起,JAXB 會生成后備名稱,例如 VALUE_1、VALUE_2 等。

當值是數字時就是這種情況,例如“1.2”、1.3”等。

在您的示例中,枚舉以值“”開頭,與 Java 常量名稱不匹配。

在這些情況下,您需要告訴 JAXB 您想要的 Java 枚舉常量名稱,對於特定 XSD 枚舉限制中的每個枚舉值。

就像我們對 MODS 3.6 xsd 所做的那樣:

<xs:element name="mods" type="modsDefinition"/>
<!--  -->
<xs:complexType name="modsDefinition">
    <xs:group ref="modsGroup" maxOccurs="unbounded"/>
    <xs:attribute name="ID" type="xs:ID"/>
    <xs:attribute name="version">
        <xs:simpleType>
            <xs:restriction base="xs:string">
                <xs:enumeration value="3.6"/>
                <xs:enumeration value="3.5"/>
                <xs:enumeration value="3.4"/>
                <xs:enumeration value="3.3"/>
                <xs:enumeration value="3.2"/>
                <xs:enumeration value="3.1"/>
                <xs:enumeration value="3.0"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:attribute>
</xs:complexType>

我們像這樣配置綁定:

<bindings
    node="xs:complexType[@name='modsDefinition']/xs:attribute[@name='version']">
    <property name="version" />
    <bindings node="xs:simpleType">
        <typesafeEnumClass name="EnumModsVersion">
            <typesafeEnumMember name="V3_6" value="3.6"/>
            <typesafeEnumMember name="V3_5" value="3.5"/>
            <typesafeEnumMember name="V3_4" value="3.4"/>
            <typesafeEnumMember name="V3_3" value="3.3"/>
            <typesafeEnumMember name="V3_2" value="3.2"/>
            <typesafeEnumMember name="V3_1" value="3.1"/>
            <typesafeEnumMember name="V3_0" value="3.0"/>
        </typesafeEnumClass>
    </bindings>
</bindings>

獲取此 Java 代碼:

@XmlType(name = "")
@XmlEnum
public enum EnumModsVersion {

    @XmlEnumValue("3.6")
    V3_6("3.6"),
    @XmlEnumValue("3.5")
    V3_5("3.5"),
    @XmlEnumValue("3.4")
    V3_4("3.4"),
    @XmlEnumValue("3.3")
    V3_3("3.3"),
    @XmlEnumValue("3.2")
    V3_2("3.2"),
    @XmlEnumValue("3.1")
    V3_1("3.1"),
    @XmlEnumValue("3.0")
    V3_0("3.0");
    private final String value;

    EnumModsVersion(String v) {
        value = v;
    }

    public String value() {
        return value;
    }

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

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM