甲骨文的jDeveloper在调用外部web服务时似乎忽略了WSDL中的声明,我不确定为什么...?
我们正在尝试使用使用WSDL:http://tbe.taleo.net/wsdl/WebAPI.wsdl找到的第三方web服务
如果将其放入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服务。这只是一个片段,因为从头到尾的整个过程都有点复杂,而且会把我想要传达的问题搞得一团糟。要测试这一点,我建议将webservice的端点更改为类似http://localhost:6667的内容,然后只嗅探http流量以查看soap消息,因为错误是在对web服务进行实际调用之前创建的,因此不需要完成对其服务器的调用。我们的企业软件是甲骨文的EnterpriseOne,他们的网络服务被称为“业务服务”,使用jDeveloper来创建它们,并与主要的企业资源规划系统接口,不确定这是否重要,但只是为了以防万一我想提到它。
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:Map类型,但正如您在这里看到的,它以某种方式被设置为ans1:hashMap,但我不知道如何告诉它使用正确的类型?
以前有没有人见过这种行为?
发布于 2011-05-28 03:28:38
事实证明这是jDeveloper中的一个错误。甲骨文正在修复一个错误。很高兴知道我没疯。:D
https://stackoverflow.com/questions/4887841
复制相似问题