【问题标题】:JAXB element of type enum枚举类型的 JAXB 元素
【发布时间】:2016-11-07 13:05:52
【问题描述】:

所以我知道如何创建枚举类型,但是当我为其设置元素类型时,元素字段将只是字符串类型而不是枚举类型。如何在我的架构中创建枚举并让 JAXB 将其生成为 java 枚举类型?

这就是我创建枚举类型和元素的方式:

<xsd:simpleType name="myEnum">
    <xsd:restriction base="xsd:string">
        <xsd:enumeration value="MY_ENUM_1"/>
        <xsd:enumeration value="MY_ENUM_2"/>
    </xsd:restriction>
</xsd:simpleType>

<xsd:element name="myEnumElement" type="ns1:myEnum"/>

【问题讨论】:

    标签: enums types schema jaxb element


    【解决方案1】:

    您可以按如下方式构建您的 XML 模式:

    <?xml version="1.0" encoding="UTF-8"?>
    <xsd:schema targetNamespace="http://www.example.com" xmlns="http://www.example.com" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <xsd:simpleType name="myEnum">
            <xsd:restriction base="xsd:string">
                <xsd:enumeration value="MY_ENUM_1"/>
                <xsd:enumeration value="MY_ENUM_2"/>
            </xsd:restriction>
        </xsd:simpleType>
        <xsd:element name="root">
            <xsd:complexType>
                <xsd:sequence>
                    <xsd:element name="local" type="myEnum"/>
                    <xsd:element name="ref" type="myEnum"/>
                </xsd:sequence>
            </xsd:complexType>
        </xsd:element>
    </xsd:schema>
    

    将导致生成以下枚举:

    package com.example;
    
    import javax.xml.bind.annotation.*;
    
    @XmlType(name = "myEnum")
    @XmlEnum
    public enum MyEnum {
    
        MY_ENUM_1,
        MY_ENUM_2;
    
        public String value() {
            return name();
        }
    
        public static MyEnum fromValue(String v) {
            return valueOf(v);
        }
    
    }
    

    以及利用该枚举的以下类:

    package com.example;
    
    import javax.xml.bind.annotation.*;
    
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = {
        "local",
        "ref"
    })
    @XmlRootElement(name = "root")
    public class Root {
    
        @XmlElement(required = true)
        protected MyEnum local;
        @XmlElement(required = true)
        protected MyEnum ref;
    
        public MyEnum getLocal() {
            return local;
        }
    
        public void setLocal(MyEnum value) {
            this.local = value;
        }
    
        public MyEnum getRef() {
            return ref;
        }
    
        public void setRef(MyEnum value) {
            this.ref = value;
        }
    
    }
    

    更多信息

    【讨论】:

    • @BlaiseDoughan 如果我从我的枚举中返回一个数字(序数)将“
    • @KanagaveluSugumar - 这篇文章将展示如何处理数字枚举值:blog.bdoughan.com/2011/08/jaxb-and-enums.html
    • fromValue 的意义何在?它与 valueOf() 的作用相同
    • @NimChimpsky - fromValue 将从 JAX-B 编译器生成代码,符合 getter/setter 命名约定
    【解决方案2】:

    jaxb:globalBindings/@typeSafeEnumBasehere

    【讨论】:

      猜你喜欢
      • 2022-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-01
      • 1970-01-01
      • 2012-09-16
      • 1970-01-01
      • 2018-10-18
      相关资源
      最近更新 更多