`
reymont
  • 浏览: 525898 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

开发CXF JAVA客户端

    博客分类:
  • CXF
 
阅读更多

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

 

  •   WSDL2Java generated Client
  •   JAX-WS Proxy
  •   JAX-WS Dispatch APIs
  •   JAX-WS Client Proxy
  •   Dynamic Client
    •   Reflection API
    •   Service Model API

 

在这里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 

分享到:
评论
2 楼 kljjack 2012-12-30  
哎  没注释。这么多类,都是同一个功能
1 楼 yjl6691088 2012-12-21  
  木有注释 我恨你

相关推荐

    cxf 开发webservice客户端

    cxf 开发webservice客户端 代码经过测试

    Java cxf开发webservice,分别有客户端和服务端

    2.用cxf开发webservice 3.这个服务端和客户端的小demo 在服务端 对外开放接口服务,然后在客户端 调用服务端的方法, 实现客户端(一个javaweb项目)对服务端(javaweb项目)方法的调用, 实际上就是发送和接收消息...

    使用cxf wsdl2java生成webservice客户端

    使用cxf wsdl2java生成webservice客户端命令

    CXF客户端调用例子

    CXF客户端调用例子,本例子开发语言为JAVA,包内包含服务端跟客户端

    CXF契约优先开发方式之客户端实现(client)

    本实例是基于CXF的一个客户端的实现,使用maven生成客户端代码,集成spring配置客户端实现类,访问外部接口。“CXF契约优先开发方式”中的实例为服务器端代码。

    Webservice接口,Cxf写的客户端

    Webservice接口,Cxf写的客户端, 是java项目,直接main方法运行. 开发环境:32位jdk1.7+Cxf3.1.4+tomcat7, 开发工具:myeclipse8.5. 成功访问服务端,并传送参数。测试通过。

    纯java调用ws-security+CXF实现的webservice安全接口

    纯java调用ws-security+CXF实现的webservice安全接口

    使用cxf和spring开发基于https的webservice服务端以及客户端样例

    使用cxf和spring开发基于https的webservice服务端以及客户端样例

    spring集成cxf客户端和服务器端demo(含自定义拦截器)

    spring4+cxf3,因为自己项目要用到接口开发,所以综合现有网上所有教程,终于成功写出能自动注入的demo,这个是含拦截器

    spring集成cxf客户端和服务器端demo

    spring4+cxf3,因为自己项目要用到接口开发,所以综合现有网上所有教程,终于成功写出能自动注入的demo

    ssm+cxf(基于Maven开发的ssm框架集成cxf发布web service服务)

    作为一个刚学java,被抓壮丁的写服务器端的妹子,我只想说,画了我3周才解决了所有的错误啊,真的要自己因为不懂乱写乱改的时候遇到的那些莫名其妙的错误,因此对android客户端的好感上升了不止一个Level啊....

    cxf-lazy-clients:更快地部署 CXF 客户端

    懒惰的CXF关于更快地部署 CXF 客户端(开发中)。 该库为 CXF 的 JAXRSClientFactoryBean 和 JaxWsProxyFactoryBean 提供了替代品。 两者都有一个额外的惰性参数,用于控制工厂是否创建代理的、未初始化的(惰性)...

    apache-cxf-3.2.4完整版

    apache-cxf-3.2.4完整版工具,提供java webservice开发中的客户端代码生成及服务端所需jar包

    apache-cxf-3.1.1

    CXF 既支持 WSDL优先开发,也支持从 Java 的代码优先开发模式。容易使用: CXF 设计得更加直观与容易使用。有大量简单的 API 用来快速地构建代码优先的 Services,各种 Maven 的插件也使集成更加容易,支持 JAX-WS ...

    CXF Web Service & client

    使用CXF开发Web Service,包含服务器端和客户端

    cxfclientlogger:Cxf客户端记录器项目

    #Cxf客户端记录器 概述 记录Web服务是开发世界的一个普遍问题。 该项目旨在以不同的方式解决此问题。 许多人编写了自己的日志记录机制以通过拦截器记录Web服务。 该项目代替您完成了整个肮脏的工作。 我们的拦截器将...

    CXF框架应用在Web项目中

    基于CXF的webservice开发 1、服务器端 Ⅰ)开发web service业务接口,该接口用@WebService修饰; Ⅱ)开发web service业务接口的实现类,也要用@WebService修饰; Ⅲ)使用EndPoint类的静态方法publish()来发布...

    cxf3.2.1 最小开发包

    cxf3.2.1自己整理的最少开发包 如不带jetty和spring的依赖包。出现Cannot create a secure XMLInputFactory异常提示时通常是少了woodstox-core-asl-4.2.0.jar或stax2-api这两个包,少这两个包服务能够启动成功,但...

    CXF的学习笔记

    CXF 既支持 WSDL 优先开发,也支持从 Java 的代码优先开发模式。容易使用: CXF 设计得更加直观与容易使用。有大量简单的 API 用来快速地构建代码优先的 Services,各种 Maven 的插件也使集成更加容易,支持 JAX-WS ...

Global site tag (gtag.js) - Google Analytics