6

私はWSDLを持っています(外部プロバイダーから入手しました)。このような行があります:

  <xsd:complexType name="SalesRequest">
                <xsd:all>
                    <xsd:element name="merchantid" type="xsd:int"/>
                    <xsd:element name="password" type="xsd:string"/>
                    ...
                </xsd:all>
  </xsd:complexType>

  ... 
  <message name="SalesResponse">
        <part name="request" type="tns:SalesResponse"/>
  </message>
  ..
  <portType name="InterfacePortType">
    <operation name="Sales">
        <documentation>some text</documentation>
        <input message="tns:SalesRequest"/>
        <output message="tns:SalesResponse"/>
  </operation>

このWSDLに基づいて(JAX-RPCを使用して)Javaクラスを生成しました。

次に、Axis Serviceを作成しました(MyServiceはInterfacePortTypeを実装しています)。

XSDDファイルを準備してMyServiceをWebアプリにデプロイしました。

そこで、MySeriveのメソッドの1つを呼び出し、サーバー側での応答のシリアル化の瞬間にこのエラーが発生しました。

予期しない要素名:expected = request、actual = SalesReturn

これは、私のXSDLとXSDDが他にあまり影響を与えないことを意味します。MyServiceは、次のような応答を準備しました(ただし、ネット経由で送信しないでください)。

<?xml version="1.0" encoding="utf-8"?><soapenv:Envelope 
...
<SalesReturn href="#id0"/></ns1:SalesResponse><multiRef xmlns:ns2=
...
</soapenv:Envelope>

問題は、サービスからの応答XMLで「SalesReturn」の代わりに「request」を使用するためにWSDDで何をすべきかということです。

この「 Return」サフィックスがどこから来たのかわかりません。

-私がすでに行ったいくつかのステップ:

グーグルで検索したところ、WSDLには「schemaelementFormDefault="qualified"」が含まれている必要があることがわかりました。ただし、WSDLは外部プロバイダーから提供されたものであるため、変更できません。

4

2 に答える 2

2

axistools-maven-pluginを使用して WSDD を生成し、serverSide パラメータをtrueに設定すると、WSDD ファイルが生成されます。

<plugin>
    <groupId>org.codehaus.mojo</groupId>
     <artifactId>axistools-maven-plugin</artifactId>
        <executions>
            <execution>
                <id>wsdl2java-job</id>
                 <phase>generate-sources</phase>
                    <goals>
                      <goal>wsdl2java</goal>
                    </goals>
                  <configuration>
                      <sourceDirectory>
                           src/main/config/wsdl2java/myfolder 
                       </sourceDirectory>
                        <outputDirectory>
                            ${generatedSourcesDirectory} 
                        </outputDirectory>
                        <testCases>false</testCases>
                        <serverSide>true</serverSide>
                        <subPackageByFileName> false 
                        </subPackageByFileName>
                        <packageSpace> my.api 
                        </packageSpace>
                        </configuration>
                   </execution>
     </plugin>

ところで、このプラグインを起動すると、コンパイル例外が発生しますが、WSDD が生成される可能性があります。

次に、生成された WSDD を見ると、手動で作成した WSDD にはなかった興味深い行がいくつかあります。

<operation name="sales" qname="operNS:Sales" 
xmlns:operNS="urn:Interface" 
returnQName="request" 
returnType="rtns:SalesResponse" 
xmlns:rtns="urn:Interface" soapAction="urn:Interface#Sales" >
  <parameter qname="in" type="tns:SalesRequest" xmlns:tns="urn:Interface"/>
</operation>

この部分: returnQName="request"

また、「typeMapping」タグを生成します(ただし、beanMapping を使用しました)

したがって、この変更をファイルに加えるとすぐに、すべてが機能するようになりました。

実際、最初のソースを生成するために、別のプラグインを使用しました: maven-antrun-plugin

しかし、WSDD を生成するオプションはありませんでした。

于 2012-09-28T17:05:44.857 に答える
0

エラーがあなたに伝えているのは、リクエストは次のようになるはずだということです

<soapenv:Envelope> <request> <SalesRequest>...

そしてあなたは送っています

<soapenv:Envelope> <SalesReturn>...

この理解を得る最良の方法は、SOAP UIのようなツールを試して、送信するペイロードをツールから生成しているものと比較することです。一部のツールには、入出力メッセージでパーツ名をラップまたはアンラップするオプションがあります。

お役に立てれば

于 2012-09-28T00:55:56.700 に答える