2011-09-09 64 views
3

使用JAXB,我們直接生成Java bean。在XSD,我們有一個枚舉類型(說):JAXB - 從XSD生成類 - 將枚舉轉換爲除枚舉名以外的自定義toString()

<xs:simpleType name="ColorType"> 
    <xs:restriction base="xs:string"> 
    <xs:enumeration value="Red"/> 
    <xs:enumeration value="Blue"/> 
    <xs:enumeration value="Green"/> 
</xs:restriction> </xs:simpleType> 

在數據庫中,我們可以有一個像R,B和G的紅色,黑色和綠色標誌。在某種程度上,我們的標誌只是一個字母單詞。我想枚舉,這樣... ColorType.Red.toString()等於R ...或類似的東西,這樣我可以鏈接到它。現在我手動檢查enumtype使用一些條件語句,然後插入或任何數據庫操作時,我轉換回字符串。

它來到我的腦海一些愚蠢的解決方案來解決這個問題(愚蠢的,這些解決方案都不好) 我認爲一個解決方案使用

<xs:enumeration value="R"> 

解決這個但這並不能告訴我什麼是R.

第二種解決方案可以將ColorType設置爲字符串,但這意味着我的ColorType可以是偶數Z,這在數據庫中不是任何顏色,我的意思是它將不受限制。 :(...

什麼辦法可以解決這個問題

回答

0

這可能幫助:?http://fusesource.com/docs/framework/2.1/jaxws/JAXWSCustomTypeMappingEnum.html

看來我誤解你的問題,我可以看到的唯一的解決辦法是重寫生成的類toString方法。用一個只返回Enum值的第一個字母的方法替換它,這樣RED將返回R.

+0

嘿,感謝您的幫助。但是你共享的鏈接在開始時告訴我們,如果枚舉類型的值不是'xsd:string',那麼它會告訴你如何爲int或其他類型定義映射。但我的問題,1字符串的字符串映射:( – kinshuk4

0

暫時我正在使用中間解決方案,現在我只是使用另一個ENUM,它返回XSD類型枚舉。

所以現在有1個XSD枚舉(生成):

<xs:simpleType name="ColorType"> 
    <xs:restriction base="xs:string"> 
    <xs:enumeration value="Red"/> 
    <xs:enumeration value="Blue"/> 
    <xs:enumeration value="Green"/> 
</xs:restriction> </xs:simpleType> 

在Java中的另一個枚舉手動實現一個:

enum ColorCode{ 
    Red("R"), Green("G"), Blue("B") ; 
    private String clrCode; 
    ColorCode(String s){ 
     clrCode = s; 
    } 

    public String toString(){ 
     return clrCode; 
    } 

    public static ColorCode getColorCode(ColorType clrTypeEnum){ 
     switch(clrTypeEnum){ 
      case RED: return Red; break; 
      case BLUE: return Blue; break; 
      case GREEN: return Green; break; 
     } 
    } 
} 

現在,我們可以得到顏色代碼在數據庫中插入,而不是寫,如果 - 其他代碼再次獲得顏色代碼。使用另一個枚舉作爲映射器,提供比自由類型類型如字符串的限制。

至少這是我已經制定了現在的解決辦法,不知道是不是更好的解決方案存在,請讓我知道,如果更好的東西存在,這將是很大的幫助:)

3

你可以使用一個XJB-綁定爲,像這樣

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

<jxb:bindings schemaLocation="MySchema.xsd" node="xs:simpleType[@name='ColorType']"> 
    <jxb:typesafeEnumClass> 
     <jxb:typesafeEnumMember value="Red" name="R" /> 
     <jxb:typesafeEnumMember value="Green" name="G" /> 
     <jxb:typesafeEnumMember value="Blue" name="B" /> 
    </jxb:typesafeEnumClass> 
</jxb:bindings> 

這將產生含有所需映射枚舉。您可以通過調用生成的value() - 枚舉的方法來訪問該值。 (不要忘記將正確的模式位置放入綁定,除非您的XSD被稱爲MySchema.xsd)