Jaxb не удалось собрать аннотированный класс - PullRequest
1 голос
/ 29 ноября 2011

Я использую реализацию 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.Любая идея о том, что не так в моем процессе сортировки?

Спасибо

1 Ответ

2 голосов
/ 29 ноября 2011

Вы можете собрать один экземпляр, верно?

    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>
...