8

リファレンスJAXB実装では、XmlSeeAlsoがXmlRootElementからname =値を使用するようにする方法はありますか?

私が望む効果は、type属性がXmlSeeAlsoの実際のクラス名ではなくname=値を使用することです。

これは他のJAXB実装で可能ですか?

小さな例:

@XmlRootElement(name="some_item")
public class SomeItem{...}

@XmlSeeAlso({SomeItem.class})
public class Resource {...}

XML:
<resource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="some_item">
...
</resource>

多くの努力なしで可能ですか?

4

1 に答える 1

12

@XmlSeeAlso

アノテーションの目的は、 JAXB(JSR-222)実装に、そのメタデータを処理するときにクラスのメタデータも処理する必要があることを@XmlSeeAlso知らせることです。一部の人々は、それが最も頻繁に使用されるユースケースであるため、それがマッピング継承に関連していると誤って信じています。クラスのサブクラスはJavaリフレクションを使用して決定できないため、サブクラスのマッピングも作成する必要があることをJAXB実装に通知するために使用されます。ResourceSomeItem@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には、によって提供されるルート要素があり、属性JAXBElementの値はの注釈から取得されます。xsi:type@XmlTypeResource

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<resource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="some_item"/>
于 2012-09-05T20:23:07.117 に答える