2012-09-05 43 views
5

在參考JAXB實現有無論如何讓XmlSeeAlso使用XmlRootElement中的name = value?XmlSeeAlso和XmlRootElement的名字?

我想要的效果是type屬性使用name = value而不是XmlSeeAlso中的實際類名稱。

這可能是一些其他的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反射確定類的子類,因此使用@XmlSeeAlso來讓JAXB實現知道也應該創建子類的映射。


下面是你如何能支持您的使用情況的一個例子:

資源

對應一個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具有由JAXBElementxsi:type屬性的值提供的根元素來源於@XmlType註釋上Resource

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