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)

您可以使用外部绑定文件来重命名枚举中的一项。

<?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 回答