CXF为您提供了许多途径来构建客户端。 本指南旨在让您快速了解并使用这些方法。
构造客户端
- WSDL2Java 命令生成客户端
- JAX-WS 代理
- JAX-WS 派遣 APIs
- Simple Frontend 客户端代理
- 动态客户端
构建客户端
WSDL2Java 方式生成客户端
最常见的情况之一是您拥有可能管理或不管理的服务,并且此服务具有WSDL。 在这种情况下,您通常希望从WSDL生成客户端。 这为您提供了一个强类型接口,通过它可以与服务进行交互。 生成客户端后,它的典型用法如下:
HelloService service = new HelloService();
Hello client = service.getHelloHttpPort();
String result = client.sayHi("Joe");
WSDL2Java 工具将根据WSDL文件生成 JAX-WS 客户端.。你可以通过如下三种方式运行 WSDL2java:
- 命令行方式
- Maven插件方式
- WSDL2Java API
更新示例,请参阅: Developing a JAX-WS consumer ,或查看 Hello World 示例。
JAX-WS 代理方式
您可以使用Service.create创建Service实例,而不是直接使用wsdl2java生成客户端,示例代码如下:
import java.net.URL;
import javax.xml.ws.Service;
...
URL wsdlURL = new URL("http://localhost/hello?wsdl");
QName SERVICE_NAME = new QName("http://apache.org/hello_world_soap_http", "SOAPService");
Service service = Service.create(wsdlURL, SERVICE_NAME);
Greeter client = service.getPort(Greeter.class);
String result = client.greetMe("test");
JAX-WS 调度 APIs
JAX-WS提供了“调度”机制,可以轻松地动态调用您尚未为其生成客户端的服务。 使用Dispatch机制,您可以创建消息(可以是JAXB对象,Source对象或SAAJ消息)并将它们分派给服务器。 一个简单的例子可能如下所示:
import java.net.URL;
import javax.xml.transform.Source;
import javax.xml.ws.Dispatch;
import javax.xml.ws.Service;
...
URL wsdlURL = new URL("http://localhost/hello?wsdl");
Service service = Service.create(wsdlURL, new QName("HelloService"));
Dispatch<Source> disp = service.createDispatch(new QName("HelloPort"), Source.class, Service.Mode.PAYLOAD);
Source request = new StreamSource("<hello/>")
Source response = disp.invoke(request);
注意: 您也可以在没有WSDL的情况下使用Dispatch方式。
简单的 Frontend 客户端代理方式
如果您使用simple frontend开发了服务,则可以使用ClientProxyFactoryBean API为您的服务创建Java代理客户端。 这样您就可以使用服务界面与您的服务进行通信。 有关更多信息,请参阅Simple Frontend文档。
Client client = ....;
Object[] result = client.invoke("sayHi", "Dan");
动态客户端
CXF包含一个客户端界面,允许您调用操作并为这些操作传递参数。 例如:
有两种方法可以在运行时创建客户端。
- 第一种选择是使用ClientFactoryBean或JaxWsClientFactoryBean类。 这些将为服务的SEI创建代理对象。 这些代理无法处理复杂对象。
- 第二个使用DynamicClientFactory或其子类之一。 DynamicClientFactory为WSDL中描述的复杂对象生成和编译JAXB POJO的附加步骤,以便在运行时通过反射使用。
当您使用动态语言(如Groovy和CXF)时,这非常有用,但可以直接从Java使用反射。
更多关于动态客户端的信息: Dynamic Clients