在调用外部Web服务时,Oracle的jDeveloper似乎忽略了WSDL中的声明?

时间:2011-02-03 15:07:46

标签: java web-services wsdl soapui jdeveloper

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 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服务之前创建的。没有必要完成对其服务器的调用。我们的企业软件是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但我不知道怎么告诉它使用正确的类型?

之前有没有人看到过这种行为?

1 个答案:

答案 0 :(得分:0)

事实证明这是jDeveloper中的一个错误。 Oracle正在开发一个bug修复程序。很高兴知道我不是疯了。 :d