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
, но я понятия не имею, как сказать ему использовать правильный тип?
Кто-нибудь видел этот тип поведения раньше?