Возвращение класса вместо void из метода порта - PullRequest
0 голосов
/ 30 сентября 2019

Я новичок в сервисах SOAP. У меня есть сценарий использования некоторых методов SOAP. Поэтому для этого я написал клиент для получения данных о методах порта обслуживания.

В настоящее время я понял из импортированного WSDL, что определенные методы обслуживания имеют тип возврата void. Тем не менее, я хотел бы иметь методы возврата порта. Например:

Это текущее поведение WSDL:

SomeService ss = new SomeService();
ProxyPort port = ss.getPort();
port.IdentifyBaggage(identifyBaggageIndicators,
                bagTagDetailsTopLevel, baggageGroupInfo, flightDetailsResponse, quantityDetails, dummySegment);

Однако мне нужно следующее поведение:

SomeService ss = new SomeService();
ProxyPort port = ss.getPort();
BaggageReply reply= port.IdentifyBaggage(identifyBaggageIndicators,
                bagTagDetailsTopLevel, baggageGroupInfo, flightDetailsResponse, quantityDetails, dummySegment);

Я попытался добавить возвратвведите SEI, но он выдаст мне:

Исключение в потоке "main" java.lang.ClassCastException: java.util.ArrayList нельзя преобразовать в bla.bla.bla.BaggageReply в com.sun. proxy. $ Proxy46.IdentifyBaggage (Unknown Source)

SEI выглядит примерно так:

/**
    * @param identifyBaggageIndicators
    * @param bagTagDetails
    * @param baggageGroupInfo
    * @param routingDetails
    * @param historicalDays
    * @param dummy
    */
   @WebMethod(operationName = "IdentifyBaggage", action = "http://webservices.amadeus.com/endpoint1")
   @RequestWrapper(localName = "IdentifyBaggage", targetNamespace = "http://xml.amadeus.com/endpoint1", className = "com.amadeus.xml.bla_bla.IdentifyBaggage")
   @ResponseWrapper(localName = "BaggageReply", targetNamespace = "http://xml.amadeus.com/endpoint2", className = "com.amadeus.xml.bla1_bla1.BaggageReply")
   public void dcsbagIdentifyBaggage(
       @WebParam(name = "identifyBaggageIndicators", targetNamespace = "http://some.host.com/endpoint1")
       List<StatusTypeI> identifyBaggageIndicators,
       @WebParam(name = "bagTagDetails", targetNamespace = "http://some.host.com/endpoint1")
       BaggageInformationTypeI bagTagDetails,
       @WebParam(name = "baggageGroupInfo", targetNamespace = "http://xml.amadeus.com/endpoint1")
       IdentifyBaggage.BaggageGroupInfo baggageGroupInfo,
       @WebParam(name = "routingDetails", targetNamespace = "http://xml.amadeus.com/endpoint1")
       FlightDetailsResponseType routingDetails,
       @WebParam(name = "historicalDays", targetNamespace = "http://xml.amadeus.com/endpoint1")
       NumberOfUnitsType historicalDays,
       @WebParam(name = "dummy", targetNamespace = "http://xml.amadeus.com/endpoint2", mode = WebParam.Mode.OUT)
               com.amadeus.xml.bla_bla.DummySegmentTypeI dummy);

Каким может быть способ добавления типа возвращаемого значения?

1 Ответ

0 голосов
/ 09 октября 2019

Похоже, вы выполняете сначала контракт (у вас в качестве отправной точки WSDL). Разработка клиента SOAP.

Вы должны где-то подключиться, и служба является "статической" (изменить нельзя))

1, если невозможно изменить службу SOAP (например, потому что она не ваша) и ваш WSDL правильный (из запущенной службы), вы не сможете этого сделать.

2, если имеющийся у вас WSDL устарел и вы видите типы возвращаемых данных, которых нет в WSDL, просто получите новый WSDL, сгенерируйте другие клиентские классы и используйте их.

Вы должны подключиться к услуге, которая принадлежит вам (как на стороне клиента, так и на стороне сервера, разработанной вами)

Это более интересная часть, и здесь у нас есть два разных способа:

1, Разработка первого веб-сервиса по контракту (я предпочитаю это)

Вы создали WSDL с нуля для каждой операции и сложного типа. Вы должны создать новый BaggageReply complextype и изменить операцию аналогично следующему (случайный пример wsdl):

    <message name="GetLastTradePriceInput">
        <part name="body" element="xsd1:TradePriceRequest"/>
    </message>

    <message name="GetLastTradePriceOutput">
        <part name="body" element="xsd1:TradePrice"/>
    </message>

    <portType name="StockQuotePortType">
        <operation name="GetLastTradePrice">
           <input message="tns:GetLastTradePriceInput"/>
           <output message="tns:GetLastTradePriceOutput"/>
        </operation>
    </portType>

Ключ - и определенный класс (ватрибут сообщения выходного тега). Затем заново сгенерируйте клиент и сервер, обновите serverimpl и правильно внедрите клиент.

2, сначала разработайте код (вы начали писать свои собственные классы java)

В этом случае вы опытный разработчик, который очень хорошо знает, как это сделать :) Если предположить, что у вас есть код на стороне сервера, я бы скопировал входной класс ( com.amadeus.xml.bla_bla.IdentifyBaggage) переименуйте его в выходной класс и обновите localName и пространство имен QName, членов, сеттеров / получателей и т. Д. И замените возвращаемое значение void операции на этот класс. Последнее, что нужно сделать, это обновить операцию или веб-метод, чтобы в конце возвращать BaggageReply . Конечно, ваш клиент тоже должен быть модифицирован, чтобы сделать что-то с этим ответом.

...