Java JAXB-从XSD生成类-将枚举转换为自定义toString(),而不是枚举名
使用JAXB,我们直接生成javabean。在XSD中,我们有一个枚举类型(比如说):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 一些愚蠢的解决方案出现在我的脑海中来解决这个问题(愚蠢的是,这些解决方案并
在数据库中,我们可能有红色、黑色和绿色的标志,如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>