JAXB - 从XSD生成类 - 将枚举转换为除枚举名称之外的自定义toString()

时间:2011-09-09 23:01:24

标签: java enums xsd jaxb tostring

使用JAXB,我们直接生成Java bean。在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>

在数据库中,我们可能会有红色,黑色和绿色等R,B和G等标志。在某种程度上,我们只有1个字母的标记。我想枚举,以便... ColorType.Red.toString() 等于 R ...或类似的东西,例如我可以将R链接到它。现在我使用一些条件语句手动检查enumtype,然后在插入或任何数据库操作时,我将转换回字符串。

我想到了解决这个问题的一些愚蠢的解决方案(愚蠢的是,这些解决方案并不好) 我认为使用

解决这个问题的解决方案
<xs:enumeration value="R">

但这并没有告诉我什么是R。

第二个解决方案可以将ColorType作为字符串,但这意味着我的ColorType可以是偶数Z,这不是数据库中的任何颜色,我的意思是它将是不受限制的。 :( ...

有什么方法可以解决这个问题吗?

3 个答案:

答案 0 :(得分:3)

你可以使用XJB-Binding,就像这样

<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,否则不要忘记将正确的架构位置放入绑定中)

答案 1 :(得分:0)

这可能会有所帮助:http://fusesource.com/docs/framework/2.1/jaxws/JAXWSCustomTypeMappingEnum.html

出现我误解了你的问题。我能看到的唯一解决方案是覆盖生成的类toString方法。将其替换为仅返回Enum值的第一个字母的那个。这样RED将返回R.

答案 2 :(得分: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;
       }
   }
}

现在我们可以将颜色代码插入到数据库中,而不是一次又一次地编写 - else代码来获取颜色代码。使用另一个枚举作为映射器,提供限制而不是像字符串这样的自由类型类型。

至少这是我现在解决的解决方案,不知道是否存在更好的解决方案,如果有更好的解决方案,请告诉我,这将有很大帮助:))