2 つの JavaBeansPerson
とがあるとしAddress
ます。
Person オブジェクトのリストを作成する場合、次のようにマーシャリングしたいと思います。
<persons>
<person>...</person>
</persons>
ここで説明されている手法を使用することができます: Using JAXB to unmarshal/marshal a List<String>
JaxbList に@XmlRootElement(name = "persons")
and@XmlElement(name = "person")
のアノテーションを付けることで、上記の XML にマーシャリングできます。
しかし、同じクラスを再利用してオブジェクトJaxbList<T>
のリストをマーシャリングできると便利です。Address
実際には、他にも多くの種類の豆があります。私は次のようなもので行くことができます:
<list>
<item xsi:type="person" xmlns:xsi="http://www.w2.org/2001/XmlSchema-instance"></item>
</list>
しかし、理想的には、"list" をクラス名の複数形に、"item" をクラス名に置き換えるとよいでしょう。
それで、実行時に JaxbContext などをプログラムで構成し、本質的にname
内部@XmlRootElement
の値を設定することは可能@XmlElement
ですか?
または、JaxbList
Bean タイプごとに個別の実装を作成することなく、これを機能させる他の方法はありますか? 多分 XmlJavaTypeAdapter はこの種のことを達成できますか?
以下で承認された@Blaise Doughanのソリューションを更新すると、うまく機能します。私のユース ケースでは、Java オブジェクトから XML に直接移行する必要がありました。これが機能したものです (これは私の完全な実装ではなく、デモンストレーション用の単なる擬似コードであることに注意してください)。
//JAXBContext is thread safe and so create it in constructor or
//setter or wherever:
...
JAXBContext jc = JAXBContext.newInstance(Wrapper.class, clazz);
...
public String marshal(List<T> things, Class clazz) {
//configure JAXB and marshaller
Marshaller m = jc.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
//Create wrapper based on generic list of objects
Wrapper<T> wrapper = new Wrapper<T>(things);
JAXBElement<Wrapper> wrapperJAXBElement = new JAXBElement<Wrapper>(new QName(clazz.getSimpleName().toLowerCase()+"s"), Wrapper.class, wrapper);
StringWriter result = new StringWriter();
//marshal!
m.marshal(wrapperJAXBElement, result);
return result.toString();
}