在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动态调用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);

如您所见,这确实很简单。

09-10 07:05