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

时间:2012-07-16 11:23:42

标签: java binding 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类型。
  4. 当我查看生成的类时,它们都不是接口,我无法理解为什么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>
    

    自从我第一次在网上提问时,请耐心等待我:)

3 个答案:

答案 0 :(得分:2)

感谢所有人,这是我常常犯的一个大错误,但无论如何我第一次喜欢使用stackoverflow,并且会在这里窥探一下。

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

答案 1 :(得分:0)

您是否使用@XmlRootElement注释注释了所有根类?

请参阅:Unofficial JAXB Guide - Mapping interfaces - Java.net

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

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

答案 2 :(得分:0)

我怀疑您正在尝试将JAXB 1(JSR-31)模型与JAXB 2(JSR-222)运行时一起使用。在JAXB 1实现中,生成由特定于实现的impl clases支持的spec定义的接口。在JAXB 2中,这成为规范定义的类,其标准注释与所有实现兼容。大多数JAXB 2实现都支持自己的JAXB 1模型,但是如果您尝试使用具有差异JAXB 2提供程序的JAXB 1模型,则可能需要一些额外的配置,您可能会看到此类错误。