什么是用于动态SOAP客户端操作的优秀Java库?

时间:2011-07-27 19:12:21

标签: java web-services soap wsdl client

我一直在寻找Java的SOAP客户端库,并且基于构建基于WSDL的存根和代理类的想法找到了大量的库。我有兴趣允许用户在运行时输入WSDL,解析WSDL,然后允许用户在Web服务上执行操作。

有没有人知道一个允许这个运行时使用的好的SOAP客户端库?或者有没有办法可以使用axis2 wsdl2java功能将存根构建到类加载器中并在运行时使用它们?

1 个答案:

答案 0 :(得分:3)

晚于永远。 :)

你应该分两步完成:

  • 1)解析用户通知的WSDL以检索可用的操作。请参阅this question以了解如何以简单的方式执行此操作。

  • 2)创建动态客户端以使用所选操作发送请求。可以使用Dispatch中的Apache CXF API完成此操作。

为动态客户端构建Dispatch对象(可以通过通知Web服务端点,端口名称等来动态创建):

package com.mycompany.demo;

import javax.xml.namespace.QName;
import javax.xml.ws.Service;

public class Client {
  public static void main(String args[]) {
    QName serviceName = new QName("http://org.apache.cxf", "stockQuoteReporter");
    Service s = Service.create(serviceName);

    QName portName = new QName("http://org.apache.cxf", "stockQuoteReporterPort");
    Dispatch<DOMSource> dispatch = s.createDispatch(portName,
                                                  DOMSource.class,
                                                  Service.Mode.PAYLOAD);
    ...
  }
}

构造请求消息(在下面的示例中,我们使用DOMSource):

// Creating a DOMSource Object for the request
DocumentBuilder db = DocumentBuilderFactory.newDocumentBuilder();
Document requestDoc = db.newDocument();
Element root = requestDoc.createElementNS("http://org.apache.cxf/stockExample", "getStockPrice");
root.setNodeValue("DOW");
DOMSource request = new DOMSource(requestDoc);

调用网络服务

// Dispatch disp created previously
DOMSource response = dispatch.invoke(request);

建议:

  • 如果要使Dispatch对象线程安全,请使用((BindingProvider)dispatch).getRequestContext().put("thread.local.request.context", "true");
  • 如果是这种情况,请稍后缓存Dispatch对象以供使用。构建对象的过程不是免费的。

其他方法

还有其他创建动态客户端的方法,例如使用CXF dynamic-clients API。您可以在项目的索引页面中阅读:

  

CXF支持多种允许应用程序的替代方案   与没有SEI和数据类的服务进行通信

我自己没有尝试过,但值得尝试一下。