« ViewVCのdocrootの設定 | Main | Teeda »

2007.04.06

JAXB2.0(JavaSE6)のXmlAccessType

 JavaSE6で、JAXB(Java Architecture for XML Binding) 2.0が標準で使用できるようになりました。XMLファイル(設定ファイル)とのバインドを行う機会があったので試しに使ってみました。
 @XmlElementや@XmlAttributeといった属性で指定するだけで簡単にXMLファイルの内容をオブジェクトにバインドできるのは便利ですね~。ただ、そこではまったのがXmlAccessTypeによる挙動の違い。JavaDocによるとFIELD/NONE/PROPERTY/PUBLIC_MEMBERの4種類があり(デフォルトはPUBLIC_MEMBER)、それぞれの内容に関しても記載されているのですが、具体的な挙動とのつながりがいまいちわかりにくい・・・ってことで、試してみました(もしかしたら、勘違いしているところもあるかもしれませんが)。なお、サブクラスを作成した場合の動きまではまだ試していません。

【共通】

  • バインド対象とするクラスには引数なしのデフォルトコンストラクタが必要。でなければ、does not have a no-arg default constructor.という内容のIllegalAnnotationsExceptionがスローされます。
  • @XmlElementWrapperを指定した場合、そのフィールドにおいては自動的に@XmlElementが指定されたことになるようです(まぁ、当然といえば当然ですが)。
  • transientフィールドは無条件でバインド対象外となります。transientフィールドに対して@XmlElement/@XmlAttributeを指定するとTransient field ... cannot have any JAXB annotations.という内容のIllegalAnnotationsExceptionがスローされます。

    【NONE】

  • 明示的に@XmlElement/@XmlAttributeを指定したフィールドのみがバインド対象。
  • 別途getterがあっても問題なく動作する(が、自動処理の際はそのgetterは使用されないようです)。

    【FIELD】

  • 何も指定がないフィールドは、基本的に@XmlElementが指定されたものとして扱われる。
  • 明示的にバインド対象外とするには@XmlTransientを指定する。
  • 別途getterがあっても問題なく動作する(が、自動処理の際はそのgetterは使用されないようです)。

    【PROPERTY】

  • @XmlElement/@XmlAttributeを指定したフィールドのみがバインド対象。
  • 別途getterが存在した場合、Class has two properties of the same nameという内容のIllegalAnnotationsExceptionがスローされます。

    【PUBLIC_MEMBER】

  • 特に何も指定していなかった場合、自動的にこのTypeとなります。
  • 何も指定がないフィールドは、基本的にバインド対象外となる。が、対応するsetter/getterが存在する場合、Elementとしてバインド対象となります。この場合、setter/getter経由でのバインドとなります。
  • @XmlElement/@XmlAttributeを指定した場合、対応するsetter/getterが存在する場合、Class has two properties of the same nameという内容のIllegalAnnotationsExceptionがスローされます。

     JAXBの仕様に関して理解しているわけではないので勘違いしているだけなのかもしれませんが、とりあえず雑感を。

  • XMLの内容を簡単にバインドできるのは非常に楽。
  • XMLファイルの内容をバインドする際、値の正当性チェックはどこで行えば?(PUBLIC_MEMBERとすればsetterでチェックすることは可能ですが、その場合@XmlAttribute指定をしたフィールドに対してのチェックはできません)
  • フォーマット付きの日付型や時刻型を使用する場合、どのようにすれば?

  • |

    « ViewVCのdocrootの設定 | Main | Teeda »

    Java」カテゴリの記事

    Comments

    Post a comment



    (Not displayed with comment.)


    Comments are moderated, and will not appear on this weblog until the author has approved them.



    TrackBack


    Listed below are links to weblogs that reference JAXB2.0(JavaSE6)のXmlAccessType:

    » JAXBで日付/時刻の処理 [気の向くままに・・・]
     JAXBを用いて「フォーマット付きの日付型や時刻型を使用する場合、どのようにす [Read More]

    Tracked on 2007.06.25 07:01

    « ViewVCのdocrootの設定 | Main | Teeda »