0

我在 XSD 中有一个枚举如下:

<xsd:simpleType name="Status">
    <xsd:restriction base="xsd:string">
        <xsd:enumeration value="ACTIVE"/>
        <xsd:enumeration value="INACTIVE"/>     
    </xsd:restriction>
</xsd:simpleType>

使用此模式和 JAXB 绑定文件,我想生成类似于此的枚举:

public enum Status {
    ACTIVE(1),
    INACTIVE(2);

    private final int statusId;

    Status(int statusId) {
        this.statusId = statusId;
    }

    public int getId() {
        return this.statusId
    }

    public static Status getStatusById(int id) {
        // iterate through all status and return it
    }
}

我正在尝试找出实现上述 Java 枚举的 JAXB 绑定代码。谢谢。

4

1 回答 1

0

这是我在网络上进行一些研究后可以找到的内容:我认为您不能像我在问题中那样生成枚举。您以您想要的方式编写枚举,并告诉 xjc 插件在生成的代码中使用该枚举。

您首先需要一个绑定文件来解释如何处理 XSD 文件中的枚举:binding.xml

<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    jaxb:version="2.0" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
    jaxb:extensionBindingPrefixes="xjc" xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <jaxb:bindings schemaLocation="Schema.xsd">
        <jaxb:bindings node="//xs:simpleType[@name='Status']">
            <jaxb:javaType name="com.yourcompany.project.enums.Status"
                parseMethod="com.yourcompany.project.util.ProjectUtils.parseStatus"
                printMethod="com.yourcompany.project.util.ProjectUtils.printStatus" />
        </jaxb:bindings>        
    </jaxb:bindings>

</jaxb:bindings>

接下来在binding.xml中按要求编写打印和解析方法:ProjectUtils.java

public class ProjectUtils {

    public static Status parseStatus(String statusStr) {
        return Status.valueOf(statusStr.trim().toUpperCase());              
    }

    public static String printStatus(Status status) {
        return status.name();
    }
}

现在您需要在 xjc 工具中引用 binding.xml 文件。有很多方法可以做到这一点,但在这里我使用的是 maven 插件cxf-xjc-plugin,您可以拥有一个配置文件,您可以使用该配置文件从您的 XSD 生成源文件。

<profiles>
    <profile>
        <id>xsdtojava</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.cxf</groupId>
                    <artifactId>cxf-xjc-plugin</artifactId>
                    <version>2.3.0</version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>xsdtojava</goal>
                            </goals>
                        </execution>
                    </executions>
                    <configuration>
                        <sourceRoot>${basedir}/src/main/java</sourceRoot>
                        <xsdOptions>
                            <xsdOption>
                                <extension>true</extension>
                                <xsd>${basedir}/src/main/resources/schema/Schema.xsd</xsd>
                                <bindingFile>${basedir}/src/main/resources/schema/binding.xml</bindingFile>
                                <extensionArgs>
                                    <arg>-Xdv</arg>
                                    <arg>-Xts</arg>
                                </extensionArgs>
                                <packagename>com.yourcompany.project.generated</packagename>
                            </xsdOption>
                        </xsdOptions>
                        <extensions>
                            <extension>org.apache.cxf.xjcplugins:cxf-xjc-dv:2.3.0</extension>
                            <extension>org.apache.cxf.xjcplugins:cxf-xjc-ts:2.3.0</extension>
                        </extensions>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>
于 2012-09-11T06:26:23.450 回答