为什么JAXB说“xxx是一个接口,而JAXB无法处理接口”。 即使生成的类不是接口

我使用JAXB来绑定我的xsd,然后尝试创建JAXBContext:

JAXBContext jaxbContext = JAXBContext.newInstance("my package name"); 

但是JAXB提供了180个IllegalAnnotationsException。

大多数例外都有以下消息:

  1. XXX是一个接口,JAXB无法处理接口
  2. XXX没有no-arg默认构造函数
  3. @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"); 。 最好明确指定根类。 因此,如果您有两个名为ClassAClassB根类,请以这种方式使用它:

 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模型,则可能需要一些额外的配置,您可能会看到此类错误。