2011-09-09 43 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)