我正在尝试与客户建立我的第一个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服务接收结果?