Castorを使ってセットネストを処理する方法(ListにMapを含む)


Apache CastorでObject<-->XML変換を処理すると、使用対象の中にArayListという属性があり、その中にはHashMapのセットが保存されていることがわかった。
オブジェクト属性の例

private ArrayList<Map> result;
// getResult...
// setResult...
使用習慣によって、Castor解析規則を

<class ...>
  ...
  <field name="result" type="java.util.HashMap" collection="arraylist" >
    <bind-xml name="result" node="element" />
  </field>
</class>
発生したXMLファイルの中で、HashMapは予期値がないことが分かりました。インターネットで他の人がこのような問題に遭遇したことを確認し、BUGとしてCastorに提出しましたが、Castorは対応しませんでした。
Castorの使用規則を調べてみると、ArayListとhashMapは変換規則の中でcollectionタイプに属しています。collectionの中のtypeは各種のカスタムオブジェクトを作ることができますが、依然としてcollectionではありません。
解決策は、カスタムオブジェクトを追加してHashMapを包装し、ARrayListにカスタムオブジェクトを置くことによって解決されます。
オブジェクトの属性を

private ArrayList<Bean> result;
// getResult...
// setResult...
オブジェクトをカスタマイズ

class Bean {
  private HashMap map = new HashMap();
  
  // setMap...
  // getMap...
}
変換規則の設定方法

<class ...>
  ...
  <field name="result" type="custom.Bean" collection="arraylist" >
    <bind-xml name="result" node="element" />
  </field>
</class>
<class name="custom.Bean">
  <map-to xml="Bean" />
  <field name="map" collection="map" >
    <bind-xml name="map" node="element" />
  </field>		
</class>