torutkのブログ

ソフトウェア・エンジニアのブログ

JAXBでJavaクラスのアノテーションでアトリビュートの順番を制御

JAXBでJavaクラスからXML schema生成 - torutkの日記の続きです。
Measureクラスのフィールドに@XmlAttributeを指定し、XMLにmarshalした際、XMLアトリビュートの順番を制御するには、エレメント同様@XmlTypeの属性propOrderを利用できます。

XMLアトリビュートの場合、順番は制限されないので、XML文書上で自由な順番にすることがきます。しかし、JavaインスタンスからXMLに出力するときに、順番がちぐはぐだと都合が悪いことがあります(例:座標のXとYが逆になっていると、人がXML文書を修正する際、間違える率が高まる)。

@XmlType(propOrder={"temperature", "humidity", "windDirection", "windSpeed"})
public class Measure {
    @XmlAttribute
    private double temperature;
    @XmlAttribute
    private double humidity;
    @XmlAttribute
    private int windDirection;
    @XmlAttribute
    private int windSpeed;
    @XmlAttribute
    @XmlJavaTypeAdapter(XmlDateAdapter.class)
    private Calendar dateTime;

すると、

        <measure dateTime="2011-10-01 22:00:00" temperature="21.5" humidity="55.0" windDirection="122" windSpeed="3"/>

のように順番が制御できます。

温度、湿度、風向、風速の順番に並べています。

Java SE 6のJAXB(バージョン2.1)では逆順になる(バグ)

ところが、Java SE 6のJAXBでは、@XmlType(propOrder=...)で指定した順の逆順でXMLが生成されてしまいます。

Java SE 7のJAXB(バージョン2.2)ではこの問題が修正されています。