CXF提供了很多client端的调用方法。这里让你快速了解这些选择,帮助你判断使用哪种。
参见:
http://cxf.apache.org/docs/how-do-i-develop-a-client.html
源代码主体使用PacktPub.Apache.CXF.Web.Service.Development.Dec.2009书中的代码。本例中,将5种调用方式集中在一个工程中,并使用Maven重组的调用方式。
本例下载地址:
http://dl.iteye.com/topics/download/c647dae6-de86-3eec-9590-7fcf83e9def4
在这里Dispatch本节内容不做介绍。
WSDL2Java generated Client
也就是依据wsdl文件生成java客户端,直接调用。查看调用方式,也就是OrderProcessService的getOrderProcessPort方法,获得服务的引用。
启动服务端
mvn test –Pserver
在启动服务端时,通过maven-compiler-plugin编译class,通过cxf-codegen-plugin依据src/main/resources/OrderProcess.wsdl生成存根类OrderProcessService
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>${cxf.version}</version>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<wsdlOptions>
<wsdlOption>
<wsdl>src/main/resources/OrderProcess.wsdl</wsdl>
</wsdlOption>
</wsdlOptions>
</configuration>
<goals>
<goal>wsdl2java</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
启动客户端
mvn test -PStubClient
JAX-WS Proxy
和生成存根类的方式相反,proxy是不需要执行wsdl2java的。但是在编译环境中需要接口类和VO类。这里,通过指定WSDL_LOCATION和PORT_NAME,使用Service.create创建service,使用service.getPort获得服务引用。
package demo.order.client;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import demo.order.Order;
import demo.order.OrderProcess;
public class ProxyClient {
private static final QName SERVICE_NAME = new QName("http://order.demo/", "OrderProcessService");
private static final QName PORT_NAME = new QName("http://order.demo/", "OrderProcessPort");
private static final String WSDL_LOCATION = "http://localhost:8080/OrderProcess?wsdl";
public static void main(String args[]) throws Exception {
URL wsdlURL = new URL(WSDL_LOCATION);
Service service = Service.create(wsdlURL, SERVICE_NAME);
OrderProcess port = service.getPort(PORT_NAME, OrderProcess.class);
Order order = new Order();
order.setCustomerID("C001");
order.setItemID("I001");
order.setPrice(100.00);
order.setQty(20);
String result = port.processOrder(order);
System.out.println("The order ID is " + result);
}
}
启动服务端
mvn test –Pserver
启动客户端
mvn test -PProxyClient
Client Proxy
使用JaxWsProxyFactoryBean 类简化Proxy。
package demo.order.client;
import demo.order.Order;
import demo.order.OrderProcess;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
public class ClientProxyClient {
public static void main(String args[]) throws Exception {
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setServiceClass(OrderProcess.class);
factory.setAddress("http://localhost:8080/OrderProcess");
OrderProcess service = (OrderProcess)factory.create();
Order order = new Order();
order.setCustomerID("C001");
order.setItemID("I001");
order.setPrice(100.00);
order.setQty(20);
String result = service.processOrder(order);
System.out.println("The order ID is " + result);
}
}
启动服务端
mvn test –Pserver
启动客户端
mvn test -PClientProxyClient
Dynamic Client
甚至不需要SEI接口类,
Reflection API
JaxWsDynamicClientFactory.newInstance获得JaxWsDynamicClientFactory实例。通过dcf.createClient获得Client客户端引用。
package demo.order.client;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
import org.apache.cxf.endpoint.Client;
import java.lang.reflect.Method;
public class OrderProcessJaxWsDynamicClient {
public OrderProcessJaxWsDynamicClient() {
}
public static void main(String str[]) throws Exception {
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);
Method m2 = order.getClass().getMethod("setItemID", String.class);
Method m3 = order.getClass().getMethod("setQty", Integer.class);
Method m4 = order.getClass().getMethod("setPrice", Double.class);
m1.invoke(order, "C001");
m2.invoke(order, "I001");
m3.invoke(order, 100);
m4.invoke(order, 200.00);
Object[] response = client.invoke("processOrder", order);
System.out.println("Response is " + response[0]);
}
}
启动服务端
mvn test –Pserver
启动客户端
mvn test -POrderProcessJaxWsDynamicClient
Service Model API
最后,Service Model是CXF内置的获取Service的信息。
package demo.order.client;
import java.beans.PropertyDescriptor;
import java.util.List;
import javax.xml.namespace.QName;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.endpoint.Endpoint;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
import org.apache.cxf.service.model.BindingInfo;
import org.apache.cxf.service.model.BindingMessageInfo;
import org.apache.cxf.service.model.BindingOperationInfo;
import org.apache.cxf.service.model.MessagePartInfo;
import org.apache.cxf.service.model.ServiceInfo;
public class OrderProcessJaxWsDynClient {
public OrderProcessJaxWsDynClient() {
}
public static void main(String str[]) throws Exception {
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
Client client = dcf.createClient("http://localhost:8080/OrderProcess?wsdl");
Endpoint endpoint = client.getEndpoint();
// Make use of CXF service model to introspect the existing WSDL
ServiceInfo serviceInfo = endpoint.getService().getServiceInfos().get(0);
QName bindingName = new QName("http://order.demo/", "OrderProcessServiceSoapBinding");
BindingInfo binding = serviceInfo.getBinding(bindingName);
QName opName = new QName("http://order.demo/", "processOrder");
BindingOperationInfo boi = binding.getOperation(opName); // Operation name is processOrder
BindingMessageInfo inputMessageInfo = null;
if (!boi.isUnwrapped()) {
//OrderProcess uses document literal wrapped style.
inputMessageInfo = boi.getWrappedOperation().getInput();
} else {
inputMessageInfo = boi.getUnwrappedOperation().getInput();
}
List<MessagePartInfo> parts = inputMessageInfo.getMessageParts();
MessagePartInfo partInfo = parts.get(0); // Input class is Order
// Get the input class Order
Class<?> orderClass = partInfo.getTypeClass();
Object orderObject = orderClass.newInstance();
// Populate the Order bean
// Set customer ID, item ID, price and quantity
PropertyDescriptor custProperty = new PropertyDescriptor("customerID", orderClass);
custProperty.getWriteMethod().invoke(orderObject, "C001");
PropertyDescriptor itemProperty = new PropertyDescriptor("itemID", orderClass);
itemProperty.getWriteMethod().invoke(orderObject, "I001");
PropertyDescriptor priceProperty = new PropertyDescriptor("price", orderClass);
priceProperty.getWriteMethod().invoke(orderObject, Double.valueOf(100.00));
PropertyDescriptor qtyProperty = new PropertyDescriptor("qty", orderClass);
qtyProperty.getWriteMethod().invoke(orderObject, Integer.valueOf(20));
// Invoke the processOrder() method and print the result
// The response class is String
Object[] result = client.invoke(opName, orderObject);
System.out.println("The order ID is " + result[0]);
}
}
启动服务端
mvn test –Pserver
启动客户端
mvn test -POrderProcessJaxWsDynClient
分享到:
相关推荐
cxf 开发webservice客户端 代码经过测试
2.用cxf开发webservice 3.这个服务端和客户端的小demo 在服务端 对外开放接口服务,然后在客户端 调用服务端的方法, 实现客户端(一个javaweb项目)对服务端(javaweb项目)方法的调用, 实际上就是发送和接收消息...
使用cxf wsdl2java生成webservice客户端命令
CXF客户端调用例子,本例子开发语言为JAVA,包内包含服务端跟客户端
本实例是基于CXF的一个客户端的实现,使用maven生成客户端代码,集成spring配置客户端实现类,访问外部接口。“CXF契约优先开发方式”中的实例为服务器端代码。
Webservice接口,Cxf写的客户端, 是java项目,直接main方法运行. 开发环境:32位jdk1.7+Cxf3.1.4+tomcat7, 开发工具:myeclipse8.5. 成功访问服务端,并传送参数。测试通过。
纯java调用ws-security+CXF实现的webservice安全接口
使用cxf和spring开发基于https的webservice服务端以及客户端样例
spring4+cxf3,因为自己项目要用到接口开发,所以综合现有网上所有教程,终于成功写出能自动注入的demo,这个是含拦截器
spring4+cxf3,因为自己项目要用到接口开发,所以综合现有网上所有教程,终于成功写出能自动注入的demo
作为一个刚学java,被抓壮丁的写服务器端的妹子,我只想说,画了我3周才解决了所有的错误啊,真的要自己因为不懂乱写乱改的时候遇到的那些莫名其妙的错误,因此对android客户端的好感上升了不止一个Level啊....
懒惰的CXF关于更快地部署 CXF 客户端(开发中)。 该库为 CXF 的 JAXRSClientFactoryBean 和 JaxWsProxyFactoryBean 提供了替代品。 两者都有一个额外的惰性参数,用于控制工厂是否创建代理的、未初始化的(惰性)...
apache-cxf-3.2.4完整版工具,提供java webservice开发中的客户端代码生成及服务端所需jar包
CXF 既支持 WSDL优先开发,也支持从 Java 的代码优先开发模式。容易使用: CXF 设计得更加直观与容易使用。有大量简单的 API 用来快速地构建代码优先的 Services,各种 Maven 的插件也使集成更加容易,支持 JAX-WS ...
使用CXF开发Web Service,包含服务器端和客户端
#Cxf客户端记录器 概述 记录Web服务是开发世界的一个普遍问题。 该项目旨在以不同的方式解决此问题。 许多人编写了自己的日志记录机制以通过拦截器记录Web服务。 该项目代替您完成了整个肮脏的工作。 我们的拦截器将...
基于CXF的webservice开发 1、服务器端 Ⅰ)开发web service业务接口,该接口用@WebService修饰; Ⅱ)开发web service业务接口的实现类,也要用@WebService修饰; Ⅲ)使用EndPoint类的静态方法publish()来发布...
cxf3.2.1自己整理的最少开发包 如不带jetty和spring的依赖包。出现Cannot create a secure XMLInputFactory异常提示时通常是少了woodstox-core-asl-4.2.0.jar或stax2-api这两个包,少这两个包服务能够启动成功,但...
CXF 既支持 WSDL 优先开发,也支持从 Java 的代码优先开发模式。容易使用: CXF 设计得更加直观与容易使用。有大量简单的 API 用来快速地构建代码优先的 Services,各种 Maven 的插件也使集成更加容易,支持 JAX-WS ...