我正在尝试非官方 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 { ... }\nRun 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.]\nRun Code Online (Sandbox Code Playgroud)\n\n编辑:发布 JAXBContext.newInstance 代码:
\n\nZoo 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);\nRun Code Online (Sandbox Code Playgroud)\n
尝试指定您提供给的列表中的其他类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)