在我的代码中,我需要将基于我的模式的XML文件中的枚举类型映射到代码的另一部分中的枚举类型,反之亦然。
问题在于构造如:
<simpleType name="sensorKindType">
<restriction base="string">
<enumeration value="ATS_S2_VOLTAGE_1_2" />
<enumeration value="ATS_S2_VOLTAGE_2_3" />
</restriction>
</simpleType>
将导致生成以下内容。
@XmlEnumValue("ATS_S2_VOLTAGE_1_2")
ATS_S_2_VOLTAGE_1_2("ATS_S2_VOLTAGE_1_2"),
@XmlEnumValue("ATS_S2_VOLTAGE_2_3")
ATS_S_2_VOLTAGE_2_3("ATS_S2_VOLTAGE_2_3"),
但是,我更喜欢的是拥有以下内容:
@XmlEnumValue("ATS_S2_VOLTAGE_1_2")
ATS_S2_VOLTAGE_1_2("ATS_S2_VOLTAGE_1_2"),
@XmlEnumValue("ATS_S2_VOLTAGE_2_3")
ATS_S2_VOLTAGE_2_3("ATS_S2_VOLTAGE_2_3"),
换句话说,S和2之间没有下划线。
答案 0 :(得分:1)
您可以使用自定义JAXB绑定控制生成的枚举的名称。如果您可以访问架构,则可以在架构中内联这些绑定,如下所示。如果您无法访问架构,则可以在外部绑定文件中定义这些首选项。
<xs:schema elementFormDefault="qualified"
targetNamespace="stackoverflow"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
jaxb:version="2.1"
xsi:schemaLocation=
"http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd">
<xs:simpleType name="sensorKindType">
<xs:restriction base="xs:string">
<xs:enumeration value="ATS_S2_VOLTAGE_1_2">
<xs:annotation>
<xs:appinfo>
<jaxb:typesafeEnumMember name="ATS_S2_VOLTAGE_1_2"/>
</xs:appinfo>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="ATS_S2_VOLTAGE_2_3">
<xs:annotation>
<xs:appinfo>
<jaxb:typesafeEnumMember name="ATS_S2_VOLTAGE_2_3"/>
</xs:appinfo>
</xs:annotation>
</xs:enumeration>
</xs:restriction>
</xs:simpleType>
这对我来说很合适,JAXB maven插件的默认设置在你的pom文件中有以下代码段:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<id>xjc</id>
<goals>
<goal>xjc</goal>
</goals>
</execution>
</executions>
</plugin>
生成以下类型:
@XmlType(name = "sensorKindType", namespace = "stackoverflow")
@XmlEnum
public enum SensorKindType {
ATS_S2_VOLTAGE_1_2,
ATS_S2_VOLTAGE_2_3;
public String value() {
return name();
}
public static SensorKindType fromValue(String v) {
return valueOf(v);
}
}