自定义wsimport的java代码生成

时间:2013-09-11 16:38:39

标签: java wsimport

在我的XSD中,我有以下类型定义:

<xs:simpleType name="Color">
    <xs:annotation />
    <xs:restriction base="xs:token">
        <xs:enumeration value="B">
            <xs:annotation>
                <xs:appinfo>
                    <codeName>BLUE</codeName>
                </xs:appinfo>
            </xs:annotation>
        </xs:enumeration>
        <xs:enumeration value="R">
            <xs:annotation>
                <xs:appinfo>
                    <codeName>RED</codeName>
                </xs:appinfo>
            </xs:annotation>
        </xs:enumeration>
    </xs:restriction>
</xs:simpleType>

开箱即用wsimport将生成以下java枚举:

public enum Color {
    B,
    R;

    public String value() {
        return name();
    }

    public static Color fromValue(String v) {
        return valueOf(v);
    }
}

我希望wsimport考虑代号元素<codeName>BLUE</codeName>中的长描述,并将它们作为java枚举中的实例变量包含在内。这是不可能的,例如使用JAXB绑定文件?

1 个答案:

答案 0 :(得分:1)

您可以通过提供JAXB bindings file来提供值的一对一映射。在绑定文件中,您需要以下内容:

<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
               xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
               jaxb:version="2.0">
  <jaxb:bindings schemaLocation="mySchema.xsd">
    <jaxb:bindings node="xsd:simpleType[@name='Color']">
        <jaxb:typesafeEnumClass>
            <jaxb:typesafeEnumMember value="R" name="RED" />
            <jaxb:typesafeEnumMember value="B" name="BLUE" />
        </jaxb:typesafeEnumClass>
    </jaxb:bindings>
  </jaxb:bindings>
<jaxb:bindings>

或者,您可以在架构内部提供JAXB绑定,但我不喜欢这种方法,因为它会使架构混乱,并且实现细节可能不适用于所有人。

以下是一个例子:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
           jxb:version="1.0">

    <xs:simpleType name="Color">
        <!--xs:annotation>
            <xs:appinfo>
                <jaxb:typesafeEnumClass />
            </xs:appinfo>
        </xs:annotation-->
        <xs:restriction base="xs:token">
            <xs:enumeration value="B">
                <xs:annotation>
                    <xs:appinfo>
                        <jaxb:typesafeEnumMember name="BLUE" />
                    </xs:appinfo>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="R">
                <xs:annotation>
                    <xs:appinfo>
                        <jaxb:typesafeEnumMember name="RED" />
                    </xs:appinfo>
                </xs:annotation>
            </xs:enumeration>
        </xs:restriction>
    </xs:simpleType>

</xs:schema>

你也可以一次完成所有这一切,因为它与实际值有点不相交,因此有点重复:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
           jxb:version="1.0">

    <xs:simpleType name="Color">
        <xs:annotation>
            <xs:appinfo>
                <jaxb:typesafeEnumClass>
                    <jaxb:typesafeEnumMember name="RED" />
                    <jaxb:typesafeEnumMember name="BLUE" />
                </jaxb:typesafeEnumClass>
            </xs:appinfo>
        </xs:annotation>
        <xs:restriction base="xs:token">
            <xs:enumeration value="B" />
            <xs:enumeration value="R" />
        </xs:restriction>
    </xs:simpleType>

</xs:schema>