4

JAXB を使用して xsd をバインドし、JAXBContext を作成しようとしました。

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

しかし、JAXB は 180 IllegalAnnotationsException を返します。

ほとんどの例外には、次のメッセージがあります。

  1. XXX はインターフェイスであり、JAXB はインターフェイスを処理できません
  2. XXX には引数なしのデフォルト コンストラクタがありません
  3. @XmlAttribute/@XmlValue は、XML のテキストにマップされる Java 型を参照する必要があります。

生成されたクラスを見ると、どれもインターフェースではなく、なぜ JAXB がそれらをインターフェースとして解釈するのか理解できません。

以下は、JAXB によって報告されたエラーの 1 つのスタック トレースです。

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>

ネットで質問するのは初めてなので気長にお待ちください:)

4

3 に答える 3

2

おかげさまで、いつものように大きな間違いでしたが、とにかく初めてstackoverflowを使って楽しんだので、この辺りを覗き見することにします。

問題はクラスパスにありました。クラスパスにjarとして含まれているjaxbによって生成されたものと同じパッケージとクラスを持つJavaソースを持つxmlbeansバインディングプロジェクトを参照していました。だから私は同じ名前とパッケージの2つのクラスを持っていましたが、私の悲惨なことにJAXBはXmlbeansクラスを選んでいて、2日間それを認識していませんでした。これはJavaで最も古いエラーの1つであり、失敗をお詫びします。説明が必要な場合は、コメントをドロップしてください。

于 2012-07-19T12:27:48.193 に答える
0

JAXB 2 ( JSR-222 ) ランタイムで JAXB 1 ( JSR-31 ) モデルを使用しようとしていると思われます。JAXB 1 実装では、実装固有の impl クラスに基づく仕様定義のインターフェースが生成されました。JAXB 2 では、これは、すべての実装と互換性のある標準アノテーションを持つ仕様定義クラスになりました。ほとんどの JAXB 2 実装は独自の JAXB 1 モデルをサポートしていますが、追加の構成が必要になる場合があります。異なる JAXB 2 プロバイダーで JAXB 1 モデルを使用しようとすると、このタイプのエラーが表示される場合があります。

于 2012-07-17T16:05:39.887 に答える
0

すべてのルート クラスに@XmlRootElement注釈を付けましたか?

参照:非公式 JAXB ガイド - インターフェースのマッピング - Java.net

次に、 を介して JAXBContext を作成しないことをお勧めしますJAXBContext.newInstance("my package name");。ルート クラスを明示的に指定することをお勧めします。したがって、2 つのルート クラスに名前ClassAを付けて、次のClassBように使用する場合:

JAXBContext.newInstance(new Class[] {ClassA.class, ClassB.class});
于 2012-07-16T12:06:48.850 に答える