JAXB で構造化データを表現する

Java6 から JAXB が標準で含まれるようになりました。

構造を持ったデータを表現できるので、プロパティファイルでは不足していてデータベースでは大袈裟な領域で活躍しそうです。たとえば設定ファイルには適しているのではないでしょうか。

JAXB を使えばこんな感じの設定ファイルにアクセスするためのクラスが簡単に作れます。

<config version="1.0">
  <server host="myhost" port="7001"/>
  <field-def-list>
    <field-def>
      ...
    </field-def>
  </field-def-list>
</config>

JAXB は高機能ですがこういった用途であれば以下のアノテーションだけ覚えておけば十分でしょう。

@XmlRootElement

@XmlType

@XmlElement

@XmlElementWrapper

@XmlAttribute

上述の config XML は下記のように定義できます。

@XmlRootElement(name = "config")

@XmlType

public class Configuration {

    @XmlAttribute(name = "version")
    public String version;

    @XmlElement(name = "server")
    public Server server;

    @XmlElementWrapper(name = "field-def-list")
    @XmlElement(name = "field-def")
    public List fieldDefList;

}

内部で使う設定ファイルですから全部 public でいいと思います。気になる場合は必要な設定へのアクセサを持ったインタフェースを経由させるようにすれば使用される設定項目が明確になります。

public interface ServerConfig {

    String hostName getHostName();
    int portNumber getPortNumber();

}

こういうのの実装クラスを、必要なクラスにインジェクトします。

@Inject

private ServerConfig serverConfig;

ちょっと脱線しましたが JAXB は手軽にちょっとした構造化データを扱うことができ便利です。少しのアノテーションを覚えれば使えるので試されてはいかがでしょうか。

- Andy