【问题标题】:JAXB Enum Generating as VALUE_1 Instead of XSD String NamesJAXB 枚举生成为 VALUE_1 而不是 XSD 字符串名称
【发布时间】:2021-03-03 15:49:33
【问题描述】:

我有一个 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 类有点奇怪,因为它将字段值生成为

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

在绑定 xjb 文件(某些属性或其他东西)中是否有一种方法可以使其生成字符串名称而不是通用的“VALUE_1”。这是一个较小的示例,其中还有另一个包含 300 多个值的枚举!这是一个外部 XSD(由我们组织中的其他团队拥有),所以我不能直接进去修改 XSD。

任何指针将不胜感激。

【问题讨论】:

    标签: java jaxb xjc


    【解决方案1】:

    最有可能的是,从其中一个值无法转换为 Java Enum 常量名称的那一刻起,JAXB 就会生成后备名称,例如 VALUE_1、VALUE_2 等。

    当值是数字时就是这种情况,例如“1.2”、1.3”等。

    在您的示例中,枚举以值“”开头,与 Java 常量名称不匹配。

    在这些情况下,对于特定 XSD 枚举限制中的每个枚举值,您需要告诉 JAXB 您想要哪个 Java 枚举常量名称。

    就像我们为 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);
        }
    
    }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-20
      • 2021-06-10
      • 1970-01-01
      • 1970-01-01
      • 2019-01-22
      • 2015-08-02
      • 1970-01-01
      相关资源
      最近更新 更多