2012-07-16 89 views
4

我使用JAXB绑定我的XSD的,然后试图创建的JAXBContext:为什么JAXB会说“xxx是一个接口,而JAXB不能处理接口”。即使生成的类不是接口

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

但JAXB使180 IllegalAnnotationsException。

大部分的异常有以下消息:

  1. XXX是一个接口,而JAXB无法处理接口
  2. XXX没有一个无参数的默认构造函数
  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定义:

<xs:complexType name="EnvelopeType"> 
    <xs:sequence> 
     <xs:element name="Sent" type="DateTimeType"/> 
     <xs:element name="Identifier" type="String_1_14"/> 
     <xs:element name="AcknowledgementCode" type="AcknowledgementCodeType"/> 
    </xs:sequence> 

<xs:simpleType name="AcknowledgementCodeType"> 
    <xs:restriction base="xs:string"> 
     <xs:enumeration value="m"/> 
     <xs:enumeration value="p"/> 
    </xs:restriction> 
</xs:simpleType> 

下面是我用来生成绑定的pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
<modelVersion>4.0.0</modelVersion> 
<groupId>com.cs</groupId> 
<artifactId>cs-jaxb</artifactId> 
<packaging>jar</packaging> 
<dependencies> 
    <dependency> 
     <groupId>com.sun.xml.bind</groupId> 
     <artifactId>jaxb-impl</artifactId> 
     <version>2.2.4-1</version> 
    </dependency> 
</dependencies> 
<name>cs jaxb</name> 
<version>1.0.0</version> 
<parent> 
    <artifactId>hip-jaxb-parent</artifactId> 
    <groupId>com.cs</groupId> 
    <version>0.0.1-SNAPSHOT</version> 
</parent> 
<build> 
    <defaultGoal>install</defaultGoal> 
    <plugins> 
     <plugin> 

      <groupId>org.jvnet.jaxb2.maven2</groupId> 
      <artifactId>maven-jaxb2-plugin</artifactId> 
      <version>0.8.0</version> 
      <executions> 
       <execution> 

        <id>CS</id> 
        <goals> 
         <goal>generate</goal> 
        </goals> 
        <configuration> 
         <schemaDirectory>src/main/resources/</schemaDirectory> 
         <schemaIncludes> 
          <include>**/*.xsd</include> 
         </schemaIncludes> 

        </configuration> 
       </execution> 

      </executions> 
     </plugin> 
     <plugin> 
      <inherited>true</inherited> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <configuration> 
       <source>1.6</source> 
       <target>1.6</target> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

请自其第一次我问一个问题,在网络:)

+1

发布更多信息 - 无法从你发布的信息中分辨出来。 – duffymo 2012-07-16 11:26:58

+0

'EnvelopeType'真的是一个界面吗?有没有机会尝试在JAXB 2运行时使用JAXB 1模型? – 2012-07-17 16:05:16

+0

感谢您的回复,我附上了我使用过的pom.xml,我的运行时也是JAXB2。 – 2012-07-18 13:01:52

回答

0

你有注解的所有根类与@XmlRootElement注释病人和我在一起?

参见:Unofficial JAXB Guide - Mapping interfaces - Java.net

其次,我建议你不要通过JAXBContext.newInstance("my package name");创建的JAXBContext。最好明确指定根类。因此,如果你有两个根类命名ClassAClassB使用这种方式:

JAXBContext.newInstance(new Class[] {ClassA.class, ClassB.class}); 
+1

您不需要使用'@ XmlRootElement'注释所有类。如果模型是从XML模式生成的,那么在'String'上下文路径上创建'JAXBContext'是最好的选择。 – 2012-07-16 13:39:57

0

我怀疑你是试图用一个JAXB 1(JSR-31)模型与JAXB 2(JSR-222)运行。在JAXB 1实现中生成了由实现特定的impl clases支持的spec定义的接口。在JAXB 2中,这变成了spec定义的类,它具有与所有实现兼容的标准注释。大多数JAXB 2实现都支持它们自己的JAXB 1模型,但是一些额外的配置可能是必需的,如果您尝试使用带有不同JAXB 2提供程序的JAXB 1模型,您可能会看到这种类型的错误。

2

感谢所有人,我一如既往地犯了一个很大的错误,但无论如何,我很喜欢第一次使用stackoverflow,并会在这里探讨一下。

问题在于我的类路径。我指的是一个xmlbeans绑定项目,该项目的java源代码包含与jaxb生成的相同的包和类,它们作为jar包含在我的类路径中。 所以我有两个具有相同名称和包的类,但是对于我的痛苦JAXB选择了Xmlbeans类,并且我没有意识到这两天。这是Java中最古老的错误之一,我为错误道歉。如果任何人需要任何澄清,请放下评论。

相关问题