为什么JAXB说“xxx是一个接口,而JAXB无法处理接口”。 即使生成的类不是接口
我使用JAXB来绑定我的xsd,然后尝试创建JAXBContext:
JAXBContext jaxbContext = JAXBContext.newInstance("my package name");
但是JAXB提供了180个IllegalAnnotationsException。
大多数例外都有以下消息:
- XXX是一个接口,JAXB无法处理接口
- XXX没有no-arg默认构造函数
- @XmlAttribute / @ XmlValue需要引用映射到XML文本的Java类型。
当我查看生成的类时,它们都不是接口,我无法理解为什么JAXB将它们解释为接口。
这是JAXB报告的错误之一的堆栈跟踪:
com.sc.md.datatypes.schemas.csemessage.EnvelopeType is an interface, and JAXB can't handle interfaces. this problem is related to the following location: at com.sc.md.datatypes.schemas.csemessage.EnvelopeType at protected com.sc.md.datatypes.schemas.csemessage.EnvelopeType com.sc.md.datatypes.schemas.csemessage.cseMessage.envelope at com.sc.md.datatypes.schemas.csemessage.cseMessage com.sc.md.datatypes.schemas.csemessage.EnvelopeType does not have a no-arg default constructor. this problem is related to the following location: at com.sc.md.datatypes.schemas.csemessage.EnvelopeType at protected com.sc.md.datatypes.schemas.csemessage.EnvelopeType com.sc.md.datatypes.schemas.csemessage.cseMessage.envelope at com.sc.md.datatypes.schemas.csemessage.cseMessage
这就是在xsd中定义类型的方式:
这是我用来生成绑定的pom.xml:
4.0.0 com.cs cs-jaxb jar com.sun.xml.bind jaxb-impl 2.2.4-1 cs jaxb 1.0.0 hip-jaxb-parent com.cs 0.0.1-SNAPSHOT install org.jvnet.jaxb2.maven2 maven-jaxb2-plugin 0.8.0 CS generate src/main/resources/ **/*.xsd true org.apache.maven.plugins maven-compiler-plugin 1.6 1.6
自从我第一次在网上提问以来,请耐心等待我:)
感谢所有人,这是我常常犯的一个大错误,但无论如何我第一次喜欢使用stackoverflow并且会在这里窥探一下。
问题在于我的classpath。我指的是一个xmlbeans绑定项目,该项目的java源代码与jaxb生成的包和类相同,它们在我的类路径中包含为jar。 所以我有两个同名和包的类,但是我的痛苦JAXB选择了Xmlbeans类,我没有意识到这两天。这是Java中最古老的错误之一,我为这个错误道歉。如果有人需要任何澄清请发表评论。
您是否使用@XmlRootElement
注释注释了所有根类?
请参阅: 非官方JAXB指南 – 映射接口 – Java.net
其次,我建议你不要通过JAXBContext.newInstance("my package name");
创建你的JAXBContext JAXBContext.newInstance("my package name");
。 最好明确指定根类。 因此,如果您有两个名为ClassA
和ClassB
根类,请以这种方式使用它:
JAXBContext.newInstance(new Class[] {ClassA.class, ClassB.class});
我怀疑您正在尝试将JAXB 1( JSR-31 )模型与JAXB 2( JSR-222 )运行时一起使用。 在JAXB 1实现中,生成由特定于实现的impl clases支持的spec定义的接口。 在JAXB 2中,这成为规范定义的类,其标准注释与所有实现兼容。 大多数JAXB 2实现都支持他们自己的JAXB 1模型,但是如果您尝试使用具有差异JAXB 2提供程序的JAXB 1模型,则可能需要一些额外的配置,您可能会看到此类错误。