Java 将DOM节点作为任何对象添加到JAXB类

Java 将DOM节点作为任何对象添加到JAXB类,java,xml,jaxb,Java,Xml,Jaxb,我有一个包含任何元素的jaxb类: @XmlAnyElement(lax = true) protected List<Object> any; 然后我做marhsalling: DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document document = db.newDocument(); /

我有一个包含任何元素的jaxb类:

@XmlAnyElement(lax = true)
protected List<Object> any;
然后我做marhsalling:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.newDocument();
// Marshal the Object to a Document
JAXBContext jc2 = JAXBContext.newInstance(BookEntry.class);
Marshaller marshaller = jc2.createMarshaller();
marshaller.marshal(book, document);
将整个Jaxb类编组回xml失败,出现异常:

com.sun.istack.SAXException2:无法将类型“MyApp.MyJaxBClass.BookEntry”封送为元素,因为它缺少@XmlRootElement注释]


如何以编程方式将节点正确地添加到任意列表中?

您必须提供根XML元素,这对于每个有效的XML文档基本上都是必需的。 有两种方法可以声明我附带的根元素

A)在代码中,创建根
JAXBElement
并将其传递给封送员:

QName qName = new QName("com.example.jaxb.model", "book-entry");
JAXBElement<BookEntry> root = new JAXBElement<BookEntry>(qName, BookEntry.class, book);
...
marshaller.marshal(root, document);

两种选择应该产生相同的结果。

谢谢!将我的Jaxb类包装在一个JAXBElement中就成功了。所以A)为我工作!
QName qName = new QName("com.example.jaxb.model", "book-entry");
JAXBElement<BookEntry> root = new JAXBElement<BookEntry>(qName, BookEntry.class, book);
...
marshaller.marshal(root, document);
@XmlRootElement(name = "book-entry", namespace = "com.example.jaxb.model")
public class BookEntry { ... }