java - 编码从使用 JAXB 实现接口(interface)的类实例化的 Java 对象

标签 java xml eclipse interface jaxb

当我们为类使用接口(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/

相关文章:

android - float 操作按钮未出现在 kitkat 中

java - 实例化工具包时遇到问题?

eclipse - 如何向我的 GEF 编辑器添加双击监听器?

java - 无法从 Office 365 门户打开我的应用程序。获取应用程序错误的未定义登录 URL

java - 需要查找特定角色的所有用户 JPA Criteria API

Java,如何通过1个大类合并较小的类?

java - 更改另一个类的 JLabel 文本

android - 使用抽屉导航标题栏颜色没有改变

xml - Xlsx 样式填充图案错误

eclipse - 生命周期配置未涵盖插件执行