Как использовать клиент веб-службы, созданный CXF? - PullRequest
0 голосов
/ 19 июня 2019

Я пытаюсь установить свой самый первый веб-сервис с клиентом.Я создал сервис через нашу систему ERP и развернул его там.Это простой сервис, который получает входные значения и возвращает их сумму (все в типе Long).Я проверил это с помощью SOAPUI, и он работает.

Теперь я хочу написать для него Java-клиент, вставить значения и отобразить результат.Я создал динамический веб-проект и создал новый клиент веб-службы.Для этого я использовал Apache CXF, и он дал мне 21 класс, что немного ошеломило меня.(Мне вообще нужен генератор для этого простого проекта?)

Это то, что я пробовал до сих пор:

public static void main(String[] args) {
    TestWebServiceCalc ws = new TestWebServiceCalc();

    ws.setVal1(1L); 
    ws.setVal2(2L);  // so it should calculate 1+2

    TestWebServiceCalcSoapPortImpl sc_impl = new TestWebServiceCalcSoapPortImpl();
    Calc01RequestType c = new Calc01RequestType();
    DataArea da = new DataArea();
    da.getTestWebServiceCalc().add(ws);
    c.setDataArea(da);

    try {
        Calc01ResponseType r = sc_impl.calc01(c);

        System.out.println(r.getDataArea().getTestWebServiceCalc().get(0).getResult()); 
       // gives the result -2174802356507956826

    } catch (Result e) {
        System.out.println(e);
        e.printStackTrace();
    }

}

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

Из SOAPUI мой XML-код запроса / ответа будет выглядеть следующим образом:

запрос:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tes="http://www.infor.com/businessinterface/TestWebServiceCalc">
   <soapenv:Header>
   </soapenv:Header>
   <soapenv:Body>
      <tes:Calc01>
         <Calc01Request>
            <ControlArea>
               <processingScope>request</processingScope>
            </ControlArea>
            <DataArea>
               <TestWebServiceCalc>
                  <val1>1</val1>
                  <val2>2</val2>
               </TestWebServiceCalc>
            </DataArea>
         </Calc01Request>
      </tes:Calc01>
   </soapenv:Body>
</soapenv:Envelope>

ответ:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Body>
      <Calc01Response xmlns="http://www.infor.com/businessinterface/TestWebServiceCalc">
         <Calc01Response xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="">
            <DataArea>
               <TestWebServiceCalc>
                  <result>3</result>
               </TestWebServiceCalc>
            </DataArea>
         </Calc01Response>
      </Calc01Response>
   </S:Body>
</S:Envelope>

Редактировать : Я нашел, почему это дает мне странное значение.В сгенерированном TestWebServiceCalcSoapPortImpl.calc01() он устанавливает:

_returnDataAreaTestWebServiceCalcVal1.setResult(Long.valueOf(-2174802356507956826l));

Кажется, что он даже не пытается использовать веб-сервис.Зачем?Как я могу отправить данные в веб-сервис и получить от него результат напрямую?

...