如何使用Apache CXF创建具有基本身份验证的动态Web服务客户端?

时间:2010-12-10 20:37:16

标签: web-services dynamic tdd cxf basic-authentication

我想用TDD开发SOAP Web服务。 Web服务基于Apache CXF构建,并通过基本身份验证进行保护。我的想法是在动态客户端的帮助下设置单元测试,以避免代理的创建过程。

该文档显示了如何创建动态客户端1

JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
Client client = dcf.createClient("http://localhost:8080/OrderProcess?wsdl");
Object order = Thread.currentThread().getContextClassLoader()
    .loadClass("demo.order.Order").newInstance();
Method m1 = order.getClass().getMethod("setCustomerID", String.class);
m1.invoke(order, "C001");
Object[] response = client.invoke("processOrder", order);

好的,这看起来很有希望。但是如何为基本身份验证指定用户名和密码? WSDL和服务本身都受基本身份验证保护。

再见,
奥拉夫

1 个答案:

答案 0 :(得分:2)

我看了一下Apache CXF的源代码。我认为当前版本的CXF(2.3.1)无法从受基本身份验证保护的URL检索WSDL。通常以这种方式创建动态客户端:

JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
Client client = dcf.createClient(
    "http://localhost:8080/ws-auth/EchoService?wsdl");

不幸的是,你会得到一个ServiceConstructionException作为回报:

org.apache.cxf.service.factory.ServiceConstructionException: 
Could not resolve URL "http://localhost:8080/ws-auth/EchoService?wsdl".
at org.apache.cxf.endpoint.dynamic.DynamicClientFactory.composeUrl(DynamicClientFactory.java:6)
...

我找不到任何设置基本身份验证凭据的地方。作为一种解决方法,我可以借助第二个工具(可能是httpclient)下载WSDL并将其存储在临时文件夹中。 CXF可以使用此文件,并在创建客户端时使用该文件。我试过这种方式,但我没有运气。出现了另一个例外。这并不奇怪,因为我无法找到如何将凭据交给动态创建的客户端。 Apache CXF的文档可能更广泛。

坦率地说,我不确定Apache CXF是否是完成任务的最佳选择。有没有人知道一个支持SOAP Web服务测试的工具或框架?正如我之前提到的,它应该通过解析WSDL来动态创建服务代理。也许在java世界之外有工作解决方案。 Ruby或Python人员如何处理这个问题?也许我可以在我的单元测试中使用JRuby或Jython来采用他们的方法。

相关问题