JAXB绑定文件:具有整数id的枚举

时间:2012-09-07 23:13:21

标签: xsd jaxb maven-jaxb2-plugin

我在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
    }
}

我试图找出JAXB绑定代码来实现上面的Java枚举。谢谢。

1 个答案:

答案 0 :(得分: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中的要求编写print和parse方法: 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>