まず、私が達成したいことをお見せしたいと思います。次のようなクラスから XML ファイルを生成したいと考えています。
<config>
<criteria name="criteriaName" defaultValue="0">
<item value="1">
<criteria name="criteriaName2" defaultValue="">
<item value="foo">
</item>
<item value="bar">
</item>
</criteria>
</item>
<item value="2">
</item>
</criteria>
<criteria name="criteriaName3" defaultValue="">
<item value="foo">
</item>
</criteria>
</config>
概要:
- Criteria には、名前とデフォルト値 (String、int、または double のいずれか) があり、子として x 項目があります。
- Item には値があり、親基準の defaultValue と同じタイプでなければなりません。
- Item は別の基準を保持することもできます。条件の defaultValue のタイプは、親 (項目) のタイプから独立しています
例えば:
criteria (type int)
item (type int)
criteria(type String)
item(type String)
また、後で検証を行いたいため、このモデルをクラスの形で必要とします。
今、私は特定の時点で苦労しています。最初に私のクラスをお見せしましょう:
構成:
@XmlAccessorType(value=XmlAccessType.FIELD)
@XmlRootElement(name="config")
public class Config {
@XmlElement(name = "criteria")
private List<Criteria> criteriaList = new ArrayList<Criteria>();
/*getters and setters*/
}
基準:
@XmlAccessorType(value=XmlAccessType.FIELD)
@XmlRootElement(name="criteria")
public class Criteria<T> {
@XmlAttribute
private T key;
@XmlAttribute
private String display;
@XmlAttribute
private T defaultValue;
private List<Item<T>> items = new ArrayList<Item<T>>();
public T getKey() {
return key;
}
/*getters and setters*/
}
アイテム:
@XmlAccessorType(value=XmlAccessType.FIELD)
@XmlRootElement(name="item")
public class Item<T>{
@XmlAttribute
protected T key;
@XmlAttribute
protected String display;
@XmlElement
protected List<Criteria<T>> criteria = new ArrayList<Criteria<T>>();
/*getters and setters*/
}
これで、同じタイプのアイテムを持つ特定のタイプの基準を作成できます。
ここで、アイテムとは異なるタイプのアイテムの下に基準を挿入したいのですが、それは可能ではありません:
Config config = new Config();
Criteria<Integer> criteria = new Criteria<Integer>();
Item<Integer> item = new Item<Integer>();
Criteria<String> subCriteria = new Criteria<String>();
//this obviously doesn't work
item.getCriteria().add(subCriteria); //<--
criteria.getItems().add(item);
config.addCriteria(criteria);
私はまた、この宣言のようなものを試しました(アイテム内):
@XmlElement
protected <U> List<Criteria<U>> criteria;
しかし、それはプロパティではなく、メソッドに対してのみ機能します。
誰でも助けることができますか?