Oracle jDeveloper, кажется, игнорирует объявления в WSDL при вызове внешнего веб-сервиса? - PullRequest
0 голосов
/ 03 февраля 2011

Oracle jDeveloper, похоже, игнорирует объявления игнорирования в WSDL при вызове внешнего веб-сервиса, и я не уверен, почему ...?

Мы пытаемся использовать сторонний веб-сервис, найденный с использованием этого WSDL: 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>

Странная часть в том, что когда мы используем этот WSDL в jDeveloper и вызываем операцию searchCandidate, по какой-то причине jdeveloper создает следующее мыльное сообщение xml. Обратите внимание, что <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 и вызываем веб-сервис. Это всего лишь фрагмент, потому что весь процесс от начала до конца немного сложен и просто загромождает проблему, которую я пытаюсь здесь передать. Чтобы проверить это, я бы порекомендовал изменить конечную точку веб-сервиса на что-то вроде http://localhost:6667, а затем просто прослушать http-трафик, чтобы увидеть сообщение мыла, так как ошибка создается до того, как будет сделан фактический вызов веб-службы. нет необходимости завершать звонок на их серверы. Наше корпоративное программное обеспечение - Oracle EnterpriseOne, а их веб-сервисы называются «Бизнес-сервисы», и для их создания используется 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> должен иметь тип apachesoap:Map для WSDL, но как вы можете видеть здесь, каким-то образом он получает значение ans1:hashMap, но я понятия не имею, как сказать ему использовать правильный тип?

Кто-нибудь видел этот тип поведения раньше?

1 Ответ

0 голосов
/ 27 мая 2011

Оказывается, это была ошибка в jDeveloper. Oracle работает над исправлением ошибки. Рад, что я не сумасшедший. : D

...