如何使用CXF生成的Web服务客户端?

时间:2019-06-19 13:08:23

标签: java web-services soap cxf code-generation

我正在尝试与客户建立我的第一个Web服务。我通过我们的ERP系统创建了服务并将其部署到那里。这是一项简单的服务,可以输入值并返回它们的总和(均为Long类型)。我用SOAPUI进行了检查,并且可以正常工作。

现在,我想为其编写一个Java客户端,以插入值并显示结果。我创建了一个动态Web项目并生成了一个新的Web服务客户端。我为此使用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));

似乎它甚至没有尝试使用Web服务。为什么?如何将数据发送到Web服务并直接从Web服务接收结果?

0 个答案:

没有答案