0

Oracle の jDeveloper は、外部 Web サービスを呼び出すときに WSDL の無視宣言を無視するようですが、その理由がわかりません...?

この WSDL を使用して見つかったサード パーティの Web サービスを使用しようとしています: http://tbe.taleo.net/wsdl/WebAPI.wsdl

それを SoapUI にポップして searchCandidate 操作を開くと、リクエスト構造が次のようになっていることがわかります。in1その中にノードが含まれていることに注意してください<item>。これは WSDL で定義されています。

<urn:searchCandidate>
    <in0>?</in0>
    <in1>
        <!--Zero or more repetitions:-->
        <item>
            <key>?</key>
            <value>?</value>
        </item>
    </in1>
</urn:searchCandidate>

奇妙な点は、jDeveloper でこの WSDL を使用して searchCandidate 操作を呼び出すと、何らかの理由で jdeveloper が次の xml ソープ メッセージを作成することです。<item>そこにはありませんが、代わり<mapEntry>にその場所にあることに注意してください。

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
              xmlns:xsd="http://www.w3.org/2001/XMLSchema"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xmlns:ns0="urn:TBEWebAPI"
              xmlns:ns1="http://xml.apache.org/xml-soap">
  <env:Body>
    <ns0:searchCandidate>
      <in0>STRING DATA</in0>
      <in1 xmlns:ans1="http://www.oracle.com/webservices/internal/literal"
            xsi:type="ans1:hashMap">
        <ans1:mapEntry xsi:type="ans1:mapEntry">
          <ans1:key xsi:type="xsd:string">HireDate</ans1:key>
          <ans1:value xsi:type="xsd:string">2011-12-31</ans1:value>
        </ans1:mapEntry>
        <ans1:mapEntry xsi:type="ans1:mapEntry">
          <ans1:key xsi:type="xsd:string">status</ans1:key>
          <ans1:value xsi:type="xsd:string">Hired</ans1:value>
        </ans1:mapEntry>
      </in1>
    </ns0:searchCandidate>
  </env:Body>
</env:Envelope>

ここでは、searchCandidate パラメーターを入力して Web サービスを呼び出す方法を示します。最初から最後までのプロセス全体が少し複雑で、ここで伝えようとしている問題が混乱するだけなので、これはほんの一部です。これをテストするには、Web サービスのエンドポイントをhttp://localhost:6667のようなものに変更し、http トラフィックをスニッフィングして SOAP メッセージを確認することをお勧めします。サーバーへの呼び出しを完了する必要はありません。私たちのエンタープライズ ソフトウェアは Oracle の EnterpriseOne であり、その Web サービスは「ビジネス サービス」と呼ばれ、jDeveloper を使用してそれらを作成し、メインの ERP システムとやり取りします。

RpcrouterSoapBinding_searchCandidate_ReqS inParam = new RpcrouterSoapBinding_searchCandidate_ReqS();

// Set in0
inParam.setIn0("String Data");

// Set in1
Map inputParamMap = new HashMap();
inputParamMap.put("HireDate", "2011-12-31");
inputParamMap.put("status", "Hired");
inParam.setIn1(inputParamMap);

// Begin service call
oracle.e1.bssv.J5706002.proxy.SearchResultArr searchReturn;
RpcrouterSoapBinding_searchCandidate_RespS outParam = new RpcrouterSoapBinding_searchCandidate_RespS();
try {
    searchReturn = myPort.searchCandidate(inParam.getIn0().toString(),inParam.getIn1);
    outParam.setSearchCandidateReturn(searchReturn);
} catch(Exception err){
    System.out.println("I got an error.");                
}

このようなものを見たことがありますか?シリアライザーが WSDL を無視しているようです。 WSDL ごとに<in1>のタイプを持つ必要がありますが、ここでわかるように、どういうわけか設定されていますが、正しいタイプを使用するように指示する方法がわかりませんか?apachesoap:Mapans1:hashMap

誰もこの種の行動を見たことがありますか?

4

1 に答える 1

0

これはjDeveloperのバグであることが判明しました。Oracleはバグ修正に取り組んでいます。私が狂っていないことを知ってうれしい。:D

于 2011-05-27T19:28:38.263 に答える