有哪些适用于动态SOAP客户端操作的好的Java库?

6
我一直在寻找适用于Java的SOAP客户端库,并发现了许多基于构建基于WSDL的存根和代理类的想法的库。我有兴趣允许用户在运行时输入WSDL,解析WSDL,然后允许用户对Web服务执行操作。
有人知道一个好的SOAP客户端库可以允许这种运行时使用吗?或者是否有一种方法可以使用axis2 wsdl2java功能将存根构建到类加载器中,并在运行时使用它们?
1个回答

3

迟到总比不到好。:)

您需要分两步完成此操作:

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

  • 2)创建动态客户端以使用所选操作发送请求。可以使用Apache CXFDispatch 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);

调用Web服务。
// 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 和数据类的情况下与服务通信

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接