cxf – 动态调用Web服务的简便方法(无需JDK或代理类)

Python中,我可以轻松地使用Web服务:

from suds.client import Client
client = Client('http://www.example.org/MyService/wsdl/myservice.wsdl') #create client
result = client.service.myWSMethod("Bubi", 15)  #invoke method
print result    #print the result returned by the WS method

我想用Java达到这么简单的用法.

使用Axis或CXF,您必须创建一个Web服务客户端,即一个包复制所有Web服务方法的包,以便我们可以像使用普通方法一样调用它们.我们称之为代理类;通常它们是由wsdl2java工具生成的.

实用且用户友好.但是每当我添加/修改Web服务方法并且我想在客户端程序中使用它时,我需要重新生成代理类.

所以我找到了CXF DynamicClientFactory,这种技术避免了使用代理类:

import org.apache.cxf.endpoint.Client;
import org.apache.cxf.endpoint.dynamic.DynamicClientFactory;
//...
//create client
DynamicClientFactory dcf = DynamicClientFactory.newInstance();
Client client = dcf.createClient("http://www.example.org/MyService/wsdl/myservice.wsdl");
//invoke method
Object[] res = client.invoke("myWSMethod", "Bubi");
//print the result
System.out.println("Response:\n" + res[0]);

但不幸的是,它创建并编译代理类运行时,因此在生产机器上需要JDK.我必须避免这种情况,或者至少我不能依赖它.

我的问题:

是否有另一种方法可以在Java中以动态方式调用Web服务的任何方法,而无需在运行时使用JDK并且不生成“静态”代理类?也许有一个不同的图书馆?谢谢!

解决方法:

我知道这是一个非常古老的问题,但如果你仍然感兴趣,你可以使用soap-ws github项目:https://github.com/reficio/soap-ws

这里有一个非常简单的示例用法:

Wsdl wsdl = Wsdl.parse("http://www.webservicex.net/CurrencyConvertor.asmx?WSDL");

SoapBuilder builder = wsdl.binding()
    .localPart("CurrencyConvertorSoap")
    .find();
SoapOperation operation = builder.operation()
    .soapAction("http://www.webserviceX.NET/ConversionRate")
    .find();
Request request = builder.buildInputMessage(operation)

SoapClient client = SoapClient.builder()
    .endpointUrl("http://www.webservicex.net/CurrencyConvertor.asmx")
    .build();
String response = client.post(request);

你可以看到它非常简单.

上一篇:在Spring(2.5)中访问服务类之外的jax-rs(CXF)MessageContext


下一篇:java安全编码指南之:基础篇