JAXB编组XML时枚举输出名称而非整数值的解决求助
JAXB编组枚举值问题解决方法
问题描述
使用JAXB将Java对象编组为XML时,枚举类型PointType的字段输出的是枚举名称(如"STOP"),而非XSD定义中对应的整数值(如0)。
XSD定义
<xs:simpleType name="PointType"> <xs:restriction base="xs:int"> <xs:enumeration value="0"/> <xs:enumeration value="1"/> <xs:enumeration value="2"/> <xs:enumeration value="3"/> <xs:enumeration value="4"/> <xs:enumeration value="5"/> <xs:enumeration value="6"/> <xs:enumeration value="7"/> <xs:enumeration value="8"/> <xs:enumeration value="9"/> <xs:enumeration value="10"/> <xs:enumeration value="11"/> </xs:restriction> </xs:simpleType>
原XJC绑定配置
<jxb:bindings schemaLocation="../xsd/test.xsd"> <jxb:bindings node="//xs:simpleType[@name='PointType']"> <jxb:typesafeEnumClass/> </jxb:bindings> <jxb:bindings node="//xs:simpleType[@name='PointType']/xs:restriction/xs:enumeration[@value='0']"> <jxb:typesafeEnumMember name="STOP"/> </jxb:bindings> <jxb:bindings node="//xs:simpleType[@name='PointType']/xs:restriction/xs:enumeration[@value='1']"> <jxb:typesafeEnumMember name="ADDRESS"/> </jxb:bindings> <jxb:bindings node="//xs:simpleType[@name='PointType']/xs:restriction/xs:enumeration[@value='2']"> <jxb:typesafeEnumMember name="POI"/> </jxb:bindings> <jxb:bindings node="//xs:simpleType[@name='PointType']/xs:restriction/xs:enumeration[@value='3']"> <jxb:typesafeEnumMember name="GEO_COORDINATE"/> </jxb:bindings> <jxb:bindings node="//xs:simpleType[@name='PointType']/xs:restriction/xs:enumeration[@value='4']"> <jxb:typesafeEnumMember name="UNKNOWN"/> </jxb:bindings> <jxb:bindings node="//xs:simpleType[@name='PointType']/xs:restriction/xs:enumeration[@value='5']"> <jxb:typesafeEnumMember name="ALIAS"/> </jxb:bindings> <jxb:bindings node="//xs:simpleType[@name='PointType']/xs:restriction/xs:enumeration[@value='6']"> <jxb:typesafeEnumMember name="CAR_SHARING"/> </jxb:bindings> <jxb:bindings node="//xs:simpleType[@name='PointType']/xs:restriction/xs:enumeration[@value='7']"> <jxb:typesafeEnumMember name="TAXI"/> </jxb:bindings> <jxb:bindings node="//xs:simpleType[@name='PointType']/xs:restriction/xs:enumeration[@value='8']"> <jxb:typesafeEnumMember name="CAR_RENTAL"/> </jxb:bindings> <jxb:bindings node="//xs:simpleType[@name='PointType']/xs:restriction/xs:enumeration[@value='9']"> <jxb:typesafeEnumMember name="TARIFF_POINT"/> </jxb:bindings> <jxb:bindings node="//xs:simpleType[@name='PointType']/xs:restriction/xs:enumeration[@value='10']"> <jxb:typesafeEnumMember name="UNUSED_10"/> </jxb:bindings> <jxb:bindings node="//xs:simpleType[@name='PointType']/xs:restriction/xs:enumeration[@value='11']"> <jxb:typesafeEnumMember name="UNUSED_11"/> </jxb:bindings> </jxb:bindings>
Java代码示例
Point point = new Point(); point.setPointId(pointId); point.setType(PointType.STOP);
问题现象
编组后生成的内容中,type字段值为枚举名称而非对应整数值:
{"pointVerification":{"point": {"pointId":null,"type":"STOP","name":"Test","region":null,
解决方法
问题根源在于XJC绑定配置中,<jxb:typesafeEnumMember>未指定value属性,导致生成的枚举常量默认以名称作为序列化值。需修改绑定配置,为每个typesafeEnumMember添加value属性,匹配XSD中对应的枚举值:
<jxb:bindings schemaLocation="../xsd/test.xsd"> <jxb:bindings node="//xs:simpleType[@name='PointType']"> <jxb:typesafeEnumClass/> </jxb:bindings> <jxb:bindings node="//xs:simpleType[@name='PointType']/xs:restriction/xs:enumeration[@value='0']"> <jxb:typesafeEnumMember name="STOP" value="0"/> </jxb:bindings> <jxb:bindings node="//xs:simpleType[@name='PointType']/xs:restriction/xs:enumeration[@value='1']"> <jxb:typesafeEnumMember name="ADDRESS" value="1"/> </jxb:bindings> <jxb:bindings node="//xs:simpleType[@name='PointType']/xs:restriction/xs:enumeration[@value='2']"> <jxb:typesafeEnumMember name="POI" value="2"/> </jxb:bindings> <jxb:bindings node="//xs:simpleType[@name='PointType']/xs:restriction/xs:enumeration[@value='3']"> <jxb:typesafeEnumMember name="GEO_COORDINATE" value="3"/> </jxb:bindings> <jxb:bindings node="//xs:simpleType[@name='PointType']/xs:restriction/xs:enumeration[@value='4']"> <jxb:typesafeEnumMember name="UNKNOWN" value="4"/> </jxb:bindings> <jxb:bindings node="//xs:simpleType[@name='PointType']/xs:restriction/xs:enumeration[@value='5']"> <jxb:typesafeEnumMember name="ALIAS" value="5"/> </jxb:bindings> <jxb:bindings node="//xs:simpleType[@name='PointType']/xs:restriction/xs:enumeration[@value='6']"> <jxb:typesafeEnumMember name="CAR_SHARING" value="6"/> </jxb:bindings> <jxb:bindings node="//xs:simpleType[@name='PointType']/xs:restriction/xs:enumeration[@value='7']"> <jxb:typesafeEnumMember name="TAXI" value="7"/> </jxb:bindings> <jxb:bindings node="//xs:simpleType[@name='PointType']/xs:restriction/xs:enumeration[@value='8']"> <jxb:typesafeEnumMember name="CAR_RENTAL" value="8"/> </jxb:bindings> <jxb:bindings node="//xs:simpleType[@name='PointType']/xs:restriction/xs:enumeration[@value='9']"> <jxb:typesafeEnumMember name="TARIFF_POINT" value="9"/> </jxb:bindings> <jxb:bindings node="//xs:simpleType[@name='PointType']/xs:restriction/xs:enumeration[@value='10']"> <jxb:typesafeEnumMember name="UNUSED_10" value="10"/> </jxb:bindings> <jxb:bindings node="//xs:simpleType[@name='PointType']/xs:restriction/xs:enumeration[@value='11']"> <jxb:typesafeEnumMember name="UNUSED_11" value="11"/> </jxb:bindings> </jxb:bindings>
修改后重新生成Java类,PointType枚举的每个常量会自动带上@XmlEnumValue注解指定对应整数值,编组时将输出该值而非枚举名称。
内容的提问来源于stack exchange,提问作者Jan Kück
相关产品推荐
相关产品推荐

