2015-09-25 131 views
2

最後幾天我正在爲我的jaxb問題尋找解決方案,但沒有成功......所以我希望也許有人可以幫助我。操縱JAXB枚舉鍵名

該基地是來自外部合作伙伴的xsd模式,就是說,即我無法更改它。這些類用xjc生成沒有問題,但枚舉不是「兼容java」的。 其中一些值爲數字或字母數字,因此必須在綁定中設置屬性typesafeEnumMemberName =「generateName」。

Jaxb然後生成像VALUE_1,VALUE_2等枚舉鍵。我現在的問題是,某些枚舉有250個條目,只有條目的javadoc說明有關該值的信息。 這不是真的舒服,可以強制錯誤,因爲以下MandatType枚舉值VALUE_1的值是「E」,而不是「1」 .... 的xsd:

<xsd:simpleType name="MandatType"> 
    <xsd:annotation> 
     <xsd:documentation/> 
    </xsd:annotation> 
    <xsd:restriction base="xsd:string"> 
     <xsd:maxLength value="1"/> 
     <xsd:minLength value="1"/> 
     <xsd:enumeration value="E"> 
      <xsd:annotation> 
       <xsd:documentation>Erinnerung</xsd:documentation> 
      </xsd:annotation> 
     </xsd:enumeration> 
     <xsd:enumeration value="1"> 
      <xsd:annotation> 
       <xsd:documentation>Klage</xsd:documentation> 
      </xsd:annotation> 
     </xsd:enumeration> 
     <xsd:enumeration value="2"> 
      <xsd:annotation> 
       <xsd:documentation>Beschaffung</xsd:documentation> 
      </xsd:annotation> 
     </xsd:enumeration> 
     <xsd:enumeration value="Z"> 
      <xsd:annotation> 
       <xsd:documentation>Storno</xsd:documentation> 
      </xsd:annotation> 
     </xsd:enumeration> 
    </xsd:restriction> 
</xsd:simpleType> 

類:

@XmlType(name = "MandatType") 
@XmlEnum 
public enum MandatType { 
    /** 
    * Erinnerung 
    * 
    */ 
    @XmlEnumValue("E") 
    VALUE_1("E"), 

    /** 
    * Klage 
    * 
    */ 
    @XmlEnumValue("1") 
    VALUE_2("1"), 

    /** 
    * Beschaffung 
    * 
    */ 
    @XmlEnumValue("2") 
    VALUE_3("2"), 

    /** 
    * Storno 
    * 
    */ 
    @XmlEnumValue("Z") 
    VALUE_Z("Z"), 

    //... 
} 

我發現的唯一解決方案是在綁定enum鍵時爲每個枚舉值定義。但問題是,這是圍繞14.000價值! 那麼有沒有人有其他的想法來解決這個問題?是否有可能定義一個方法來覆蓋/更改枚舉值,當xjc生成類?或者爲枚舉的鍵使用xsd:documentation值?

提前感謝 斯蒂芬

回答

1

它可以編寫自己的JAXB插件,它可以被用來整合任意數據修改生成的代碼。這link有一些指標,您可能會探討其他信息。

或者,您可能會考慮更簡單的事情(在我看來),那就是將您的XSD重構爲可與開箱即用功能配合使用的功能。

如果你想要的是沿着這些線路,轉換成這樣:

<xsd:enumeration value="E"> 
     <xsd:annotation> 
      <xsd:documentation>Erinnerung</xsd:documentation> 
     </xsd:annotation> 
    </xsd:enumeration> 

成這樣:

<xsd:enumeration value="E"> 
     <xsd:annotation> 
      <xsd:documentation>Erinnerung</xsd:documentation> 
      <xsd:appinfo> 
       <jaxb:typesafeEnumMember name="Erinnerung"/> 
      </xsd:appinfo>    
     </xsd:annotation> 
    </xsd:enumeration> 

然後我會覺得基本的XSLT技巧來幫助你完成這個,比寫作更好一個JAXB插件,或者使用XSOM等,其中14000左右應該不會有所作爲。即使您的架構分佈在數百個文件中,也可以更容易地找到一次只執行一個架構的愚蠢的XSLT,然後爲每個文件簡單地生成命令行...

這是一個簡單的XSLT:

<xsl:stylesheet version="1.0" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="xsd:enumeration"> 
     <xsd:enumeration> 
      <xsl:attribute name="value"> 
       <xsl:value-of select="@value"/> 
      </xsl:attribute> 
      <xsd:annotation> 
       <xsl:copy-of select="xsd:annotation/xsd:documentation"/> 
       <xsd:appinfo> 
        <jaxb:typesafeEnumMember> 
         <xsl:attribute name="name"> 
          <xsl:value-of select="xsd:annotation/xsd:documentation"/> 
         </xsl:attribute> 
        </jaxb:typesafeEnumMember> 
       </xsd:appinfo>       
      </xsd:annotation> 
     </xsd:enumeration> 
    </xsl:template> 
</xsl:stylesheet> 

人能夠取代簡單的文檔「傾銷」與模板調用,它可以處理文本,或提供替代品,或發出特定條件的消息,等

生成的輸出可能看起來像這樣:

<?xml version="1.0" encoding="utf-16"?> 
<xsd:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns="http://tempuri.org/XMLSchema.xsd" xmlns:xtm="http://paschidev.com/schemas/metadata/xtm"> 
    <xsd:simpleType name="MandatType"> 
     <xsd:annotation> 
      <xsd:documentation/> 
     </xsd:annotation> 
     <xsd:restriction base="xsd:string"> 
      <xsd:maxLength value="1"/> 
      <xsd:minLength value="1"/> 
      <xsd:enumeration value="E"> 
       <xsd:annotation> 
        <xsd:documentation>Erinnerung</xsd:documentation> 
        <xsd:appinfo> 
         <jaxb:typesafeEnumMember name="Erinnerung"/> 
        </xsd:appinfo> 
       </xsd:annotation> 
      </xsd:enumeration> 
      <xsd:enumeration value="1"> 
       <xsd:annotation> 
        <xsd:documentation>Klage</xsd:documentation> 
        <xsd:appinfo> 
         <jaxb:typesafeEnumMember name="Klage"/> 
        </xsd:appinfo> 
       </xsd:annotation> 
      </xsd:enumeration> 
      <xsd:enumeration value="2"> 
       <xsd:annotation> 
        <xsd:documentation>Beschaffung</xsd:documentation> 
        <xsd:appinfo> 
         <jaxb:typesafeEnumMember name="Beschaffung"/> 
        </xsd:appinfo> 
       </xsd:annotation> 
      </xsd:enumeration> 
      <xsd:enumeration value="Z"> 
       <xsd:annotation> 
        <xsd:documentation>Storno</xsd:documentation> 
        <xsd:appinfo> 
         <jaxb:typesafeEnumMember name="Storno"/> 
        </xsd:appinfo> 
       </xsd:annotation> 
      </xsd:enumeration> 
     </xsd:restriction> 
    </xsd:simpleType> 
</xsd:schema>