11

以下を使用して Web サービスを作成しました。

  • Apache Axis 2 CodeGen Wizard v.1.6.2 (バインディング: ADB)
  • エクリプス ジュノ
  • トムキャット7
  • Java 6

サービスはカスタム Java オブジェクト (DataBean) をクライアントに返しますが、クライアント コードで例外に遭遇しました。

org.apache.axis2.AxisFault: org.apache.axis2.databinding.ADBException: Unexpected subelement {schemaTargetNs}message

私が調査したことから、何度も何度も...これは非常に一般的な問題だと思いますが、それを修正するために何をすべきかについての決定的な答えはまだ得られていません.

このフォーラムや他のフォーラムの投稿では、WSDL を変更する必要がある (一部の名前空間) か、クライアント スタブを変更する必要があると述べています。ADB にバグがあると言う人さえいます。これは確かに以前のバージョンの Axis のバグでしたが、バグが修正されたことを示すメール アーカイブの投稿が多数あります。これらのメーリング アーカイブは、以前のバージョンの Axis2 に関連していました。

今私の質問は次のとおりです。

  1. それはまだバグですか?
  2. WSDL または Client スタブで正確に何を変更する必要がありますか?

言及する価値があるのは、「文字列」をクライアントに返す同様の Web サービスを作成したことです。それは正常に動作します! そのため、複雑なデータ型が含まれていると失敗します。

「既知の制限」という見出しの下に、ApacheのWebサイトにいくつかの情報がありました...

ADB は「単純な」データバインディング フレームワークであることを意図しており、すべてのタイプのスキーマをコンパイルすることを意図していません。次の制限が最も強調されています

  1. 複合型の拡張と制限."

それが問題ですか?

次の WSDL ファイルのスニペットは、あなたにとって興味深いかもしれません...

<wsdl:types>
        <xs:schema xmlns:ax26="http://mywebservice/xsd" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="schemaTargetNs">
            <xs:import namespace="http://mywebservice/xsd"/>
            <xs:element name="getMsg">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element minOccurs="0" name="reqData" nillable="true" type="ax25:DataBean"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="getMsgResponse">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element minOccurs="0" name="return" nillable="true" type="ax25:DataBean"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:schema>
        <xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://mywebservice/xsd">
            <xs:complexType name="DataBean">
                <xs:sequence>
                    <xs:element minOccurs="0" name="message" nillable="true" type="xs:string"/>
                    <xs:element minOccurs="0" name="name" nillable="true" type="xs:string"/>
                </xs:sequence>
            </xs:complexType>
        </xs:schema>
    </wsdl:types>

さて、どうすれば問題を解決できますか? ここに他のコード スニペットを含める必要がありますか?

4

8 に答える 8

13

「予期しないサブ要素」とは、受信者が予期していなかった XML 要素が受信者によって受信されたメッセージに含まれていたことを意味します。「{schemaTargetNs}message」は、検出された予期しない要素の名前です。つまり、送信者は無効なメッセージを受信者に送信しました。

  • 送信者は、想定されていない要素を含んでいる可能性があります。
  • 送信者が必須要素を省略した可能性があります。
  • 送信者が要素を間違った順序で配置した可能性があります。
  • 送信者が完全に間違ったメッセージを送信した可能性があります。

サーバーが報告した例外を発行した場合、クライアントは無効なメッセージをサーバーに送信しました。クライアントが例外を発行した場合、エラーはサーバーからクライアントへの応答にありました。

于 2013-05-15T13:50:38.373 に答える
7

xsd(wsdl) が xml request o response で正しい場合、問題は xml 要素の順序にある​​ためです。考えられる解決策の 1 つは、-Eosv オプションを使用して axis2 クライアントを生成することです。それは私のために働きます。

于 2014-09-09T20:08:22.727 に答える
0

軸コードを確認したところ、次のことがわかりました

if( new javax.xml.namespace.QName("http://someurl","someElementName").equals(reader.getName()) )

ここでエラーが発生します。QName の equals() メソッドは、 localPart と namespaceURI をチェックします。しかし、reader.getName() には名前空間 URI が設定されていないため、エラーが発生しました

私はすべてのif-checkをから変更しました

if( new javax.xml.namespace.QName("http://someurl","someElementName").equals(reader.getName()) )

if( new javax.xml.namespace.QName("someElementName").equals(reader.getName()) )

そしてそれは私にとってはうまくいきました

于 2014-09-18T02:34:12.253 に答える
0

このエラーは、誤解を招く可能性があります。WSDL を変更し、新しい必須要素を追加した後、クライアントを作成しました。このエラーよりも表示されました。解決策は、Web サービスの 1 つのメソッドでこの要素を入力するのを忘れていたことです。このエラーが表示された場合は、必須要素がサーバー内で満たされているかどうかも確認してください。

于 2014-10-22T06:59:03.053 に答える
0

私も同じ問題を抱えていました。base64binary が 16k の制限を超えると、パーサーがエラーを出し始めます。実質的に 16k を超えるとコンテンツの読み取りが停止するため、ドキュメントの残りの部分が破損しているように見えます。

私の問題は、com.sun.xml.stream.XMLReaderImpl を使用していたことです。

削除する

<dependency>
<groupId>com.sun.xml.stream</groupId>
<artifactId>sjsxp</artifactId>
</dependency>

と追加

<dependency>
<groupId>org.codehaus.woodstox</groupId>
<artifactId>wstx-asl</artifactId>
</dependency>

私の問題を解決しました(したがって、以前に提案されたwstxが機能していました)

于 2019-01-02T11:05:48.370 に答える
0

私の場合、Web サービスは xsd にあるシーケンスとは異なる順序で要素を送信しています。現在スタブを変更しているため、Web サービスを変更する可能性がないため、順序は問題ではありません。

于 2017-11-27T16:33:04.210 に答える