【问题标题】:Jaxb failed to marshall an annotated classJaxb 未能编组带注释的类
【发布时间】:2011-11-29 16:16:42
【问题描述】:

我正在使用MessageBodyWriter 的实现将我的所有对象编组到一个文件(XML)。

@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 上确实有那个注释。 知道我的编组过程出了什么问题吗?

谢谢

【问题讨论】:

  • 调用marshaller.marshall(object, outputstream)时,objectMyClass的实例还是List<MyClass>的实例?
  • object 在这种情况下是 MyClass 的一个实例 ...

标签: java jaxb jersey


【解决方案1】:

您可以编组单个实例,对吗?

    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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    相关资源
    最近更新 更多