#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
здесь.