2011-02-03 17 views
0

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但我不知道如何告訴它使用正確的類型?

有沒有人看過這種行爲?

回答

0

事實證明,這是jDeveloper中的一個錯誤。甲骨文正在研究一個錯誤修復。很高興知道我不瘋狂。 :D