Элемент JAXB типа enum

#enums #types #schema #jaxb #element

#перечисления #типы #схема #jaxb #элемент

Вопрос:

Итак, я знаю, как создать тип enum, но когда я задаю ему тип элемента, поле элемента будет просто типа string, а не типа enum. Как мне создать перечисление в моей схеме и заставить 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"/>
  

Ответ №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;
    }

}
  

Для получения дополнительной информации

Комментарии:

1. @BlaiseDoughan Если я возвращаю числовое значение (порядковый номер) из моего перечисления, достаточно изменить «<xsd: значение перечисления=»MY_ENUM_1 />» на «значение =»0»??

2. @KanagaveluSugumar — В этом посте будет показано, как обрабатывать числовые значения enum: blog.bdoughan.com/2011/08/jaxb-and-enums.html

3. в чем смысл fromValue? Он просто выполняет то же самое, что и valueOf()

4. @NimChimpsky — fromValue будет сгенерированным кодом из компилятора JAXB, соответствующим соглашениям об именовании средств получения / установки

Ответ №2:

Смотрите jaxb:globalBindings/@typeSafeEnumBase здесь.