Raj*_*ani 3 xml enums xsd jaxb maven-jaxb2-plugin
我使用maven JaxB插件从XSD生成源。
插件的详细信息如下,
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.8.3</version>
Run Code Online (Sandbox Code Playgroud)
XSD中定义的枚举有两个值,
<simpleType name="MyEnum">
<restriction base="xsd:string">
<enumeration value="SimpleText" />
<enumeration value="ComplexText" />
</restriction>
</simpleType>
Run Code Online (Sandbox Code Playgroud)
生成的代码在枚举值的工作边界之间添加下划线。例如:“ SimpleText”在枚举中为SIMPLE_TEXT。
生成的代码,
@XmlType(name = "MyEnum")
@XmlEnum
public enum MyEnum {
@XmlEnumValue("SimpleText")
SIMPLE_TEXT("SimpleText"),
@XmlEnumValue("ComplexText")
COMPLEX_TEXT("ComplexText");
private final String value;
MyEnum(String v) {
value = v;
}
public String value() {
return value;
}
public static MyEnum fromValue(String v) {
for (MyEnum c: MyEnum.values()) {
if (c.value.equals(v)) {
return c;
}
}
throw new IllegalArgumentException(v);
}
Run Code Online (Sandbox Code Playgroud)
}
当枚举在不同位置用下划线分隔相同文本时,会出现此问题。例如
<simpleType name="MyEnum">
<restriction base="xsd:string">
<enumeration value="My_Simple_Text" />
<enumeration value="MySimple_Text" />
</restriction>
</simpleType>
Run Code Online (Sandbox Code Playgroud)
不会转换为枚举。有什么方法可以避免JaxB在单词之间添加下划线。
您可以使用外部绑定文件来自定义枚举生成:
<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='MyEnum']/xs:restriction/xs:enumeration[@value='My_Simple_Text']">
<jxb:typesafeEnumMember name="FOO"/>
</jxb:bindings>
<jxb:bindings node="//xs:simpleType[@name='MyEnum']/xs:restriction/xs:enumeration[@value='MySimple_Text']">
<jxb:typesafeEnumMember name="BAR"/>
</jxb:bindings>
</jxb:bindings>
</jxb:bindings>
Run Code Online (Sandbox Code Playgroud)
事实证明,更好的方法是改为使用以下绑定文件:
<?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:globalBindings underscoreBinding="asCharInWord"/>
</jxb:bindings>
Run Code Online (Sandbox Code Playgroud)