次の XML のような UI コントロールの XML スキーマがあります。
<InputParameters>
<Combobox name="Combo1">...</Combobox>
<Radiobutton name="Radio1">...</Radiobutton>
<Combobox name="Combo2">...</Combobox>
<Combobox name="Combo2">...</Combobox>
</InputParameters>
InputParameters
(別の JAXB 要素内のフィールド) を宣言する方法は次のとおりです。
@XmlElementWrapper(name="InputParameters")
@XmlElementRefs(
{
@XmlElementRef(name="Combobox", type=ComboboxJAXB.class),
@XmlElementRef(name="RadioButtonGroup", type=RadioButtonGroup.class)
}
)
protected List<? extends InputComponent> inputParameters;
ここでいくつかの重要なポイント:
- アイテムの順序
InputParameters
は重要です Combobox
Radiobutton
すべてがスキーマ内で同じ置換グループ ヘッドを持っています(InputComponent
)
次の点にも注目する価値があります。
InputParameters
Map
@name属性が(一意の)キーであると考えることができます(そしてそうです)- 順序が重要なので、これは Java でなければなりません
LinkedHashMap
マーシャリングからの XML 出力 (上に表示) は問題ありません。私が問題を抱えているのは、JAX-RS がこれを JSON として出力するときです。
JSON では、出力は次のようになります。
{
InputParameters : {
Combobox : {.....},
Radiobutton : {.......},
Combobox : {.....},
Combobox : {.....},
}
}
ここでの問題は次のとおりです。
InputParameters
オブジェクトには「Combobox」という名前の複数のプロパティがありますInputParameters
は配列ではなくオブジェクトであるため、アイテムの順序は表現されません
質問はこれに要約されます: JAXB にInputParameters
(順序付けされていない) オブジェクトのセットではなく (順序付けられた) 配列としてコンテンツを出力させることはできますか? それとも、私が考慮すべき非常に異なるアプローチがあるのでしょうか?
目的の JSON 出力は次のようになります。
{
InputParameters :
[
{Combobox : {.....}},
{Radiobutton : {.......}},
{Combobox : {.....}},
{Combobox : {.....}},
]
}
JAXB の参照実装を使用しています。