について@XmlSeeAlso
@XmlSeeAlso
注釈の目的は、ちょうどあなたのJAXB(JSR-222)の実装は、それがResource
のメタデータを処理しているとき、それはまたSomeItem
のメタデータを処理する必要があることを知らせることですクラス。誤って継承をマッピングすることに関連していると誤解している人がいます。これは、これが最もよく使用されるユースケースであるためです。 Javaリフレクションを使用してクラスのサブクラスを特定することはできないため、サブクラスのマッピングも作成する必要があることをJAXB実装に知らせるために@XmlSeeAlso
が使用されます。
リソース
Javaクラスに対応した複合型の名前が@XmlType
注釈を介して供給されます。
以下は、あなたのユースケースをサポートすることができる方法の一例です。
package forum12288631;
import javax.xml.bind.annotation.XmlType;
@XmlType(name="some_item")
public class Resource {
}
デモ
ルート要素名が@XmlRootElement
注釈から来ることができるか、JAXBElement
のインスタンスを介して供給することができます。 JAXBElement
のインスタンスを作成し、それがObject
のインスタンスを保持していることを示します。整列されると、xsi:type
属性が出力に含まれます。
package forum12288631;
import javax.xml.bind.*;
import javax.xml.namespace.QName;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Resource.class);
Resource resource = new Resource();
JAXBElement<Object> jaxbElement = new JAXBElement<Object>(QName.valueOf("resource"), Object.class, resource);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(jaxbElement, System.out);
}
}
出力
結果のXMLはResource
上@XmlType
注釈から来JAXBElement
とxsi:type
属性の値によって提供されるルート要素を持っています。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<resource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="some_item"/>