在调用外部 Web 服务时,Oracle 的 jDeveloper 似乎忽略了 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 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
但我不知道如何告诉它使用正确的类型?
有没有人见过这种行为?