2011-11-29 79 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