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
誰もこの種の行動を見たことがありますか?