JaxB在从XSD生成枚举时添加非核心(_)

时间:2014-11-21 09:44:25

标签: xml enums jaxb xsd maven-jaxb2-plugin

我使用maven JaxB插件从XSD生成源代码。

插件详情如下,

<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.8.3</version>

XSD中定义的枚举有两个值,

<simpleType name="MyEnum">
    <restriction base="xsd:string">
        <enumeration value="SimpleText" />
        <enumeration value="ComplexText" />
    </restriction>
</simpleType>

生成的代码在枚举值的工作边界之间添加下划线。例如:,&#34; SimpleText&#34;在枚举中出现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);
   }

}

当枚举在不同位置使用下划线分隔相同的文本时,会发生此问题。对于Eg;

<simpleType name="MyEnum">
    <restriction base="xsd:string">
        <enumeration value="My_Simple_Text" />
        <enumeration value="MySimple_Text" />
    </restriction>
</simpleType>

无法转换为枚举。 有没有办法避免JaxB在单词之间添加下划线。

1 个答案:

答案 0 :(得分:4)

您可以使用外部绑定文件来自定义枚举生成:

<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>

更新

事实证明,更好的方法是使用以下绑定文件:

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