Castorを使ってセットネストを処理する方法(ListにMapを含む)
Apache CastorでObject<-->XML変換を処理すると、使用対象の中にArayListという属性があり、その中にはHashMapのセットが保存されていることがわかった。
オブジェクト属性の例
Castorの使用規則を調べてみると、ArayListとhashMapは変換規則の中でcollectionタイプに属しています。collectionの中のtypeは各種のカスタムオブジェクトを作ることができますが、依然としてcollectionではありません。
解決策は、カスタムオブジェクトを追加してHashMapを包装し、ARrayListにカスタムオブジェクトを置くことによって解決されます。
オブジェクトの属性を
オブジェクト属性の例
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>