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

标签 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 之间没有下划线。

最佳答案

您可以使用自定义 JAXB 绑定(bind)来控制生成的枚举的名称。如果您有权访问架构,则可以将这些绑定(bind)内联到架构中,如下所示。如果您无权访问架构,则可以在外部绑定(bind)文件中定义这些首选项。

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

}

关于jaxb - 如何让 JAXB (xjc) 停止在字符和数字之间添加下划线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23004748/

相关文章:

java - 带有 Jersey : NoClassDefFoundError 的 json

java - 当 'lang' 已经定义时如何从 WSDL 生成 Java 文件?

java - JAXB 自定义接口(interface)绑定(bind)

java - JAXB classImpl 绑定(bind)(使用扩展生成的 impl 的特定 impl)但 getter 返回父类(super class)型

元素初始值设定项的 JAXB XJC 代码生成及其声明

Java jaxb从xml解码到java对象返回空值

java - 从 jPOS ISO 中提取元素值

java - 如何使用 JAXB 生成其元素可以包含字符串或 XML 的类?

java - 如何在 Maven 中的清洁包期间保护自动生成的源?

java - jaxb - 具有完整 java 包的编码根元素