1
<xs:simpleType name="PowerUnit">
    <xs:restriction base="xs:int">
        <xs:enumeration value="MWh"/>
        <xs:enumeration value="mWh"/>
    </xs:restriction>
</xs:simpleType>

Jaxbは、MWhとmWhのスペルが同じであるが大文字と小文字が異なる上記の例のクラスを生成できません。それでも、JAXBはエラーを表示しません。単に、この列挙以外の他のファイルを生成します。

このシナリオを処理する方法は?

4

1 に答える 1

1

XML スキーマ (schema.xsd)

以下は、質問に基づく XML スキーマのサンプルです。string有効にするために、ベースタイプをに変更する必要がありました。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.example.org" 
    xmlns="http://www.example.org"
    elementFormDefault="qualified">

    <xs:simpleType name="PowerUnit">
        <xs:restriction base="xs:string">
            <xs:enumeration value="MWh" />
            <xs:enumeration value="mWh" />
        </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="root">
        <xs:sequence>
            <xs:element name="power-unit" type="PowerUnit"/>
        </xs:sequence>
    </xs:complexType>

</xs:schema>

デフォルト生成クラス

JAXB (JSR-222)実装が列挙型を生成できない場合、基本型のプロパティが作成されます。

package org.example;

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "root", propOrder = {
    "powerUnit"
})
public class Root {

    @XmlElement(name = "power-unit", required = true)
    protected String powerUnit;

    public String getPowerUnit() {
        return powerUnit;
    }

}

外部バインディング ファイル (binding.xml)

外部バインディング ファイルを使用して、列挙内の項目の 1 つの名前を変更できます。

<?xml version="1.0" encoding="UTF-8"?>
<jxb:bindings
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
    version="2.1">
    <jxb:bindings schemaLocation="schema.xsd">
        <jxb:bindings node="//xs:simpleType[@name='PowerUnit']/xs:restriction/xs:enumeration[@value='mWh']">
            <jxb:typesafeEnumMember name="M"/>
        </jxb:bindings>
    </jxb:bindings>
</jxb:bindings>

新しく生成されたクラス

列挙の名前の競合が解決されたので、生成された JAXB モデルで列挙が使用されます。

package org.example;

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "root", propOrder = {
    "powerUnit"
})
public class Root {

    @XmlElement(name = "power-unit", required = true)
    protected PowerUnit powerUnit;

}

列挙型 (PowerUnit)

生成されたものは次のenumようになります。

package org.example;

import javax.xml.bind.annotation.*;

@XmlType(name = "PowerUnit")
@XmlEnum
public enum PowerUnit {

    @XmlEnumValue("MWh")
    M_WH("MWh"),
    @XmlEnumValue("mWh")
    MWH2("mWh");
    private final String value;

    PowerUnit(String v) {
        value = v;
    }

    public String value() {
        return value;
    }

    public static PowerUnit fromValue(String v) {
        for (PowerUnit c: PowerUnit.values()) {
            if (c.value.equals(v)) {
                return c;
            }
        }
        throw new IllegalArgumentException(v);
    }

}
于 2013-03-01T10:45:43.513 に答える