You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 14:03:39