在我的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绑定文件?
答案 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>