JAVA JAXB enum int value instead of enum name

Viewed 28

i have a problem with jaxb and marshalling to xml. I have this 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>

and this 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>

if i create the request with java objects i create a point object with type PointType.STOP.

Point point = new Point();
point.setPointId(pointId);
point.setType(PointType.STOP);

In the generated xml the type is 'STOP' and not the numeric value.

{"pointVerification":{"point" 
{"pointId":null,"type":"STOP","name":"Test","region":null,

The type should filled with 0 value not with the name of eneum. Can anyone help me?

1 Answers

You can do this by using the @XmlEnum annotation on your enum along with an @XmlEnumValue for each of the constants:

@XmlEnum(Integer.class)
public enum PointType {
    @XmlEnumValue("0") STOP,
    @XmlEnumValue("1") ADDRESS,
    @XmlEnumValue("2") POI,
    @XmlEnumValue("3") GEO_COORDINATE
    // etc.
}
Related