无法通过简单的示例让 JAXB 处理接口

K.N*_*las 2 java xml jaxb2

我正在尝试非官方 JAXB 指南 - 映射接口 \xe2\x80\x94 Project Kenai,第 3.2.1 节中显示的 JAXB 接口的简单示例,它对我不起作用。我使用的是最新的 JDK 1.8_70 并且没有使用任何特殊的库。为了完整起见,代码:

\n\n
@XmlRootElement\nclass Zoo {\n  @XmlAnyElement\n  public List<Animal> animals;\n}\n\ninterface Animal {\n  void sleep();\n  void eat();\n  ...\n}\n\n@XmlRootElement\nclass Dog implements Animal { ... }\n\n@XmlRootElement\nclass Lion implements Animal { ... }\n
Run Code Online (Sandbox Code Playgroud)\n\n

对此有什么帮助吗?我收到的错误是:

\n\n
[com.sun.istack.internal.SAXException2: class testjaxb.Cat nor any of its super class is known to this context.\njavax.xml.bind.JAXBException: class testjaxb.Cat nor any of its super class is known to this context.]\n
Run Code Online (Sandbox Code Playgroud)\n\n

编辑:发布 JAXBContext.newInstance 代码:

\n\n
Zoo zoo = new Zoo();\nzoo.animals = new ArrayList<Animal>();\nzoo.animals.add( new Cat() );\nzoo.animals.add( new Dog() );\nzoo.animals.add( new Dog() );\n\nJAXBContext ctx = JAXBContext.newInstance(Zoo.class);\nMarshaller marshaller = ctx.createMarshaller();\nmarshaller.marshal(zoo, System.out);\n
Run Code Online (Sandbox Code Playgroud)\n

Mic*_*ich 5

尝试指定您提供给的列表中的其他类JAXBContext.newInstance()

JAXBContext ctx = JAXBContext.newInstance(Zoo.class, Cat.class, Dog.class);
Run Code Online (Sandbox Code Playgroud)

@XmlSeeAlso注释应用于您的Zoo类也应该有效。

@XmlRootElement
@XmlSeeAlso({Cat.class, Dog.class})
class Zoo {
    ...
}
Run Code Online (Sandbox Code Playgroud)