Oracle的jDeveloper在調用外部Web服務時似乎忽略WSDL中的忽略聲明,我不知道爲什麼...?調用外部Web服務時,Oracle的jDeveloper似乎忽略了WSDL中的聲明?
我們正試圖消耗使用該WSDL發現第三方Web服務:如果您彈出該到了SoapUI http://tbe.taleo.net/wsdl/WebAPI.wsdl
,並打開searchCandidate操作,你會發現請求結構爲以下。請注意,in1
包含其中的一個<item>
節點,它在WSDL中定義。
<urn:searchCandidate>
<in0>?</in0>
<in1>
<!--Zero or more repetitions:-->
<item>
<key>?</key>
<value>?</value>
</item>
</in1>
</urn:searchCandidate>
怪異的是,當我們使用這個WSDL在JDeveloper並調用searchCandidate操作,由於某種原因,JDeveloper中構建了下面的XML SOAP消息。請注意,<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流量即可查看肥皂消息,因爲在實際調用Web服務之前創建錯誤,因此無需完成呼叫他們的服務器。我們的企業軟件是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。 <in1>
每個WSDL應該有一個apachesoap:Map
的類型,但正如你在這裏可以看到它設置爲ans1:hashMap
但我不知道如何告訴它使用正確的類型?
有沒有人看過這種行爲?