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

Web でいくつかの調査を行った結果、次のことがわかりました。質問にあるような列挙型を生成できるとは思いません。列挙型を好きなように記述し、生成されたコードでその列挙型を使用するように 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>

次に、必要に応じて、print メソッドと parse メソッドを 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 に答える