当我们为类使用接口(interface)时,如何使用 JAXB 将对象编码到 XML 文件中?我有以下简单的类:
public interface IBook {
public abstract String getName();
public abstract void setName(String name);
}
@XmlRootElement
public class Book implements IBook {
private String name;
@Override
@XmlElement(name ="BookTitle")
public String getName() {
return name;
}
@Override
public void setName(String name) {
this.name = name;
}
}
@XmlRootElement
public class BookStore {
@XmlElement(name ="BookStoreName")
public String name;
@XmlElementWrapper(name ="bookList")
@XmlAnyElement
public HashSet<IBook> books= new HashSet<IBook>();
}
当我尝试将 BookStore 中的对象编码到 XML 文件时,出现以下错误:
[com.sun.istack.internal.SAXException2: Weder class de.uni_paderborn.books.Book noch eine der zugehörigen Superklassen ist diesem Kontext bekannt.
javax.xml.bind.JAXBException: Weder class de.uni_paderborn.books.Book noch eine der zugehörigen Superklassen ist diesem Kontext bekannt.]
抱歉出现德语错误消息,但我的操作系统是德语。这意味着在此上下文中,类 Book 及其父类(super class)之一都不为人所知!为什么会出现这样的错误?
最佳答案
问题是你缺少@XmlSeeAlso在你的 BookStore 类中。像这样将它添加到您的 BookStore 类中
@XmlRootElement
@XmlSeeAlso({Book.class})
public class BookStore {
@XmlElement(name = "BookStoreName")
public String name;
@XmlElementWrapper(name = "bookList")
@XmlAnyElement
public HashSet<IBook> books = new HashSet<IBook>();
public static void main(String[] args) throws JAXBException {
BookStore bookStore = new BookStore();
bookStore.name = "FooBookStore";
Book e = new Book();
e.setName("Java");
bookStore.books.add(e);
/**
* Create JAXB Context from the classes to be serialized
*/
JAXBContext context = JAXBContext.newInstance(BookStore.class);
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
m.marshal(bookStore, System.out);
}
}
输出
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<bookStore>
<BookStoreName>FooBookStore</BookStoreName>
<bookList>
<book>
<BookTitle>Java</BookTitle>
</book>
</bookList>
</bookStore>
关于java - 编码从使用 JAXB 实现接口(interface)的类实例化的 Java 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27318242/