Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JAXB-从XSD生成类-将枚举转换为自定义toString(),而不是枚举名_Java_Enums_Xsd_Jaxb_Tostring - Fatal编程技术网

Java JAXB-从XSD生成类-将枚举转换为自定义toString(),而不是枚举名

Java JAXB-从XSD生成类-将枚举转换为自定义toString(),而不是枚举名,java,enums,xsd,jaxb,tostring,Java,Enums,Xsd,Jaxb,Tostring,使用JAXB,我们直接生成javabean。在XSD中,我们有一个枚举类型(比如说): 在数据库中,我们可能有红色、黑色和绿色的标志,如R、B和G。在某种程度上,我们的旗帜只有一个字母单词。我想列举,这样ColorType.Red.toString()等于R。。。或者类似的东西,这样我就可以把R和它联系起来。现在,我正在使用一些条件语句手动检查enumtype,然后在插入或执行任何数据库操作时,我将转换回string 一些愚蠢的解决方案出现在我的脑海中来解决这个问题(愚蠢的是,这些解决方案并

使用JAXB,我们直接生成javabean。在XSD中,我们有一个枚举类型(比如说):


在数据库中,我们可能有红色、黑色和绿色的标志,如R、B和G。在某种程度上,我们的旗帜只有一个字母单词。我想列举,这样ColorType.Red.toString()等于R。。。或者类似的东西,这样我就可以把R和它联系起来。现在,我正在使用一些条件语句手动检查enumtype,然后在插入或执行任何数据库操作时,我将转换回string

一些愚蠢的解决方案出现在我的脑海中来解决这个问题(愚蠢的是,这些解决方案并不好) 我认为解决这个问题的一个方法是使用

<xs:enumeration value="R">

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

第二种解决方案是将ColorType设置为字符串,但这意味着我的ColorType可以是偶数Z,这在数据库中不是任何颜色,在某种程度上,我的意思是它将是无限制的(

有什么办法解决这个问题吗?

这可能会有帮助:


似乎我误读了您的问题。我能看到的唯一解决方案是重写生成的类toString方法。将其替换为只返回枚举值第一个字母的方法。这样,红色将返回R。目前我使用的是中间解决方案。目前我只使用另一个枚举,其中包含一个静态方法来return XSD类型枚举

现在有1个xsd枚举(已生成):

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


至少这是我目前制定的解决方案,不知道是否存在更好的解决方案,请让我知道是否存在更好的解决方案,这将非常有帮助:)

您可以使用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)

嘿,谢谢您的帮助。但您共享的链接在开始时告诉我们,如果枚举类型值不是“xsd:string”,那么它会告诉您如何定义int或其他类型的映射。但我的问题是,1个字符字符串的字符串映射:(
<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>
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;
       }
   }
}
<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>