2011-11-29 83 views
1

上午使用MessageBodyWriter的實現將所有對象編組爲一個文件(XML)。Jaxb未能編組註釋類

@XmlRootElement(name="root") 
@XmlAccessorType(XmlAccessType.FIELD) 
class Myclass implements MyInterface{ 
// some private fields 
} 

interface MyInterface{ 
//some methods 
} 

我有一個List<MyClass>對象XML, 節省但是,當我打電話Marshaller.marshall(object, outputstream)我得到這個異常:

[com.sun.istack.SAXException2:無法馬歇爾式」 .. MyClass的」爲元素,因爲它缺少@XmlRootElement註釋]

但事實是,我確實對MyClass該批註。 關於我的編組過程中出現什麼問題的任何想法?

謝謝

+0

當你調用'marshaller.marshall(object ,outputstream)','object'是'MyClass'的一個實例或'List '的一個實例? –

+0

對象是這種情況下MyClass的一個實例... – Lahniep

回答

2

你可以編組單個實例嗎?

MyClass myClass1 = new MyClass(); 
    myClass1.setField("value"); 
    JAXB.marshal(myClass1, writer); 

但我假設你試圖列單嗎?像

List<MyClass> list = new ArrayList<MyClass>(); 
    list.add(myClass1); 
    JAXBContext.newInstance(ArrayList.class).createMarshaller().marshal(list, writer); 

的東西,如果你想馬歇爾一個XML文檔中的列表,你需要一個包裝類:

@XmlRootElement(name="root") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class MyWrapper { 

    @XmlElement(name="child") 
    private List<MyClass> list = new ArrayList<MyClass>(); 

    public List<MyClass> getList() { 
      return list; 
    } 
... 

那麼它應該工作,如:

MyClass myClass1 = new MyClass(); 
    myClass1.setField("value"); 
    MyWrapper wrapper = new MyWrapper(); 
    wrapper.getList().add(myClass1); 
    JAXB.marshal(wrapper, writer); 

結果

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
    <root> 
     <child> 
      <field>value</field> 
     </child> 
    </root> 
+0

謝謝@Michael,它解決了我的問題。 – Lahniep