3

一部のサービスをApacheSOAPからAxis2に変換しているので、Javaサービスクラスはすでに存在します。Eclipseで新しいプロジェクトを作成し、ソースをインポートし、Axis2プロジェクトファセットがインストールされていること、およびAxis2エミッターのプロパティが正しいことを確認しました。次に、Eclipseで、サービスクラスを選択し、[Webサービスの作成]を選択して、Axis2ランタイムを選択しました。サービスはPCで稼働しており、サービスのパスに「?wsdl」を追加すると、実際にローカルに保存したWSDLを取得します。これをSoapUIにインポートしてクライアントを構築しようとすると、エラーが発生します。

ERROR:org.apache.xmlbeans.XmlException: C:\projects\soapUI\Axis2\DALService.wsdl:0: error: src-resolve: type 'SOAPException@http://www.w3.org/2001/XMLSchema' not found.

参照しているタイプ(SOAPException)はApache SOAPサービスからのホールドオーバーであり、サービスコードで、サービスコード(WSDLではない)のすべての「インポート」参照をorg.apache.soap.SOAPException(古いApache SOAPパッケージ名)からjavax.xml.soap.SOAPException( Axis2の場所)。コードにアクセスできるようになると、コードはコンパイルされて機能しますが、クライアントを生成せずにアクセスすることはできません。オブジェクトの名前空間を変更すると、生成されたWSDLが適切な名前空間参照を持たなくなる理由について何か考えはありますか?

4

2 に答える 2

0

SOAP UIに直接WSDLを表示した「xxx?wsdl」URLを使用するだけです。WSDLで参照されている一部のXSDスキーマがSOAP UIツールで見つからないようです。通常、これらのツールは同じフォルダー内のスキーマも検索します。 org.apache.soap.SOAPExceptionからjavax.xml.soap.SOAPExceptionがあるため、これにより名前空間が変更された可能性があります。

完全なURLを使用してみて、結果を確認してください。

于 2010-03-17T20:06:15.887 に答える
0

なぜこれが当てはまるのかわからないということを最初に言わせてください。しかし、名前空間の正確な内容は、それらがすべて同じである限り、重要ではないかもしれないと思います。通常の例外を盲目的に拡張するだけなので、SOAPExceptionの特別な機能も使用していません。とにかく、私は3つのことを行うことで、SoapUIにXMLからクライアントを構築させることができました。

まず、SOAPException自体を表すセクションを次のように追加しました。

    <xs:schema xmlns:test="http://service.PROJECT.DEPARTMENT.COMPANY.com" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://DEPARTMENT.COMPANY.com/xsd">
        <xs:import namespace="http://service.PROJECT.DEPARTMENT.COMPANY.com"/>
        <xs:complexType name="SOAPException">
            <xs:complexContent>
                <xs:extension base="ns:Exception">
                    <xs:sequence/>
                </xs:extension>
            </xs:complexContent>
        </xs:complexType>
    </xs:schema>

次に、次の名前空間をwsdl:definitionsブロックに追加しました。

xmlns:im="http://DEPARTMENT.COMPANY.com/xsd"

第3に、SOAPExceptionベースタイプ(ここから)を参照する名前空間を、以前に参照されていた場所nsに変更しました。im

    <xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://service.ims.im.sa.homedepot.com/xsd">
        <xs:complexType name="SOAPLocatorException">
            <xs:complexContent>
                <xs:extension base="im:SOAPException">
                    <xs:sequence>
                        <xs:element minOccurs="0" name="message" nillable="true" type="xs:string"/>
                        <xs:element minOccurs="0" name="messageCode" nillable="true" type="xs:string"/>
                    </xs:sequence>
                </xs:extension>
            </xs:complexContent>
        </xs:complexType>
    </xs:schema>

XMLファイルはまだXMLSpyできれいに検証されませんが、直接影響を与えないより難解な理由のためだけです(Soap11およびSoap12バインディングに障害が定義されている操作には、生のHTTPバインディング)。

それは機能しますが、私はまだ次のことについて少し混乱しています:

  • Axis2がSOAPExceptionタイプについて知っていた場合(そして、それが他の例外の基本クラスとして言及されていたため)、なぜそれをxs:schemaブロックで定義しなかったのですか?
  • それらの同じ線に沿って、別のタイプの基本クラスとして使用するときに、なぜ誤った名前空間からクラスを参照したのですか?
  • DEPARTMENT.COMPANY.com Axis2パッケージまたはそれを使用するサービスオブジェクトのパッケージではなく、このタイプの名前空間を設定する必要があるのはなぜですか?
于 2010-03-18T19:22:54.893 に答える