2012-09-05 11 views
5

JAXB実装のリファレンスでは、とにかくXmlSeeAlsoにXmlRootElementのname = valueを使用させるようにしていますか?XmlSeeAlsoとXmlRootElementの名前は?

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

これは他の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> 

可能?

答えて

11

について@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注釈から来JAXBElementxsi:type属性の値によって提供されるルート要素を持っています。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<resource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="some_item"/> 
関連する問題