0

在调用外部 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但我不知道如何告诉它使用正确的类型?

有没有人见过这种行为?

4

1 回答 1

0

事实证明这是 jDeveloper 中的一个错误。Oracle 正在努力修复错误。很高兴知道我没有疯。:D

于 2011-05-27T19:28:38.263 回答