`
reymont
  • 浏览: 530208 次
  • 性别: 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框架开发一个Web服务客户端,以及如何进行测试。 一、CXF简介 CXF全称CXF CXF (Continued eXtensible Framework),它是一个Java框架,提供了创建和消费Web服务的能力。CXF支持WS-*...

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

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

    cxf3.1.1客户端需要最少的JAR

    Apache CXF是一个开源服务框架,它允许开发人员通过SOAP、RESTful、XML/HTTP等多种协议创建Web服务和客户端。下面,我们将深入探讨这些必要的JAR文件及其在CXF客户端中的作用。 1. `cxf-core-3.1.1.jar`:这是CXF的...

    CXF动态webservice客户端demo

    2. **创建服务代理**:使用CXF的`WSDL2Java`工具,你可以从WSDL生成Java客户端 stubs和服务接口。不过在这个“DynamicClientDemo”中,我们不直接生成这些类,而是动态创建服务代理。 3. **动态客户端**:CXF提供了...

    cxf客户端调用axis服务端流程

    在Java开发中,CXF和Axis是两种广泛使用的Web服务框架。CXF主要用来创建和消费SOAP和RESTful Web服务,而Axis则是Apache组织早期推出的一款Web服务框架,主要用于SOAP服务。本文将深入探讨如何使用CXF客户端调用Axis...

    cxf客户端所需jar包-4个

    1. **wsdl2java.jar**:这个工具是CXF的一部分,用于从WSDL(Web Service Definition Language)文件自动生成Java客户端代码。WSDL是一种XML格式,定义了Web服务的接口,包括操作、消息格式和绑定信息。使用wsdl2...

    webservice cxf 服务端客户端传递参数的例子demo

    - 生成客户端代码:使用CXF的WSDL2Java工具,根据服务的WSDL(Web服务描述语言)生成客户端代码。 - 创建服务代理:实例化生成的客户端类,创建服务代理对象。 - 调用服务:通过代理对象调用服务方法,传递参数并...

    Java webservice cxf客户端调用demo和服务端

    1. 生成客户端代理:CXF的WSDL2Java工具可以将服务端的WSDL(Web Service Description Language)文件转换为Java客户端代码,生成服务代理类。 2. 创建服务代理实例:通过代理类,客户端可以创建服务的实例,就像...

    使用cxf wsdl2java生成webservice客户端

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

    webservice的cxf框架客户端调用所需jar包

    CXF框架是Apache组织开发的一款开源的Web服务框架,它支持SOAP、RESTful等多种Web服务标准,同时也提供了客户端和服务端的实现。在使用CXF框架进行Web服务客户端调用时,需要依赖一系列的JAR包来确保功能的正常运行...

    WebService开发客户端 cxf方式

    2. **生成客户端代码**:使用CXF的wsdl2java工具,可以基于WSDL生成Java客户端 stubs和代理类。这些类包含了调用服务的方法。命令行示例如下: ``` wsdl2java -d ./src http://example.com/service?wsdl ``` 3. ...

    CXF客户端支持最少jar

    CXF客户端是开发人员用来与CXF服务交互的重要组件,它允许我们轻松地调用远程Web服务。然而,为了减小程序的体积和依赖性,有时我们需要精简CXF客户端所依赖的jar包。本文将深入探讨如何配置和使用CXF客户端所需的...

    cxf3.0.2 客户端完整jar包

    1. **CXF核心库**:提供基本的Web服务处理和调用功能,如wsdl2java工具,用于从WSDL生成Java客户端代码。 2. **HTTP传输库**:如httpclient和httpcore,负责处理HTTP通信,使CXF客户端能够通过HTTP或HTTPS与服务器...

    CXF客户端,自动生成方式

    本篇文章将深入探讨如何使用CXF作为客户端框架,通过MyEclipse集成开发环境自动生成Web服务客户端。 首先,我们要理解CXF的基本概念。CXF,全称“CXF:Confusing eXtensible Framework”,它提供了多种方式来创建...

    CXF3.1.11客户端jar包.rar

    "CXF3.1.11客户端jar包.rar"是CXF框架的一个版本3.1.11的客户端组件集合,它包含了一系列必要的jar文件,使得开发者能够快速搭建和使用CXF进行Web服务的开发。 在Web服务开发中,CXF提供了两种主要的客户端API:...

    cxf生成webservice客户端

    在标题和描述中提到的“cxf生成webservice客户端”是指利用CXF的工具从WSDL文件自动生成Java客户端代码,以便于调用Web服务。 生成Web服务客户端的步骤如下: 1. **获取WSDL文件**:Web服务通常会公开一个WSDL文件...

    CXF客户端生成器

    【CXF客户端生成器】是基于Apache CXF框架的一个实用工具,主要用于自动生成Java客户端代码,使得开发者可以方便地调用Web服务。Apache CXF是一个开源的SOAP和RESTful Web服务框架,它允许开发者创建和消费各种Web...

    apache-cxf-2.7.7以及cxf客户端所需要的jar包

    这个工具能够从WSDL(Web Service Description Language)文件自动生成Java客户端代码,使得开发者可以轻松地调用远程Web服务。使用命令行,开发者只需指定WSDL文件的位置和一些选项,CXF就会自动创建所需的客户端类...

Global site tag (gtag.js) - Google Analytics