如何让JAXB(xjc)停止在字符和数字之间添加下划线

时间:2014-04-11 06:09:52

标签: jaxb xjc

在我的代码中,我需要将基于我的模式的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之间没有下划线。

1 个答案:

答案 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);
    }

}