CXF客户端对axis服务器的访问

LunaZhang 2011-09-14

    CXF 和 axis都是非常不错的webservice的技术框架。最近项目需要了解了一下两个框架的访问。

首先说一下axis2客户端对axis2服务器的访问常用的两种方式:

1.用call方式

import org.apache.axis.client.Service;

importorg.apache.axis.client.Call;

importjavax.xml.namespace.QName;

publicclassTestClient{

publicstaticvoidmain(String[]args){

try{

     String name = "fei";

//服务发布地址

Stringendpoint="####/service";

Serviceservice=newService();

Callcall=(Call)service.createCall();

     call.setTargetEndpointAddress(endpoint);

//第一个参数是命名空间,第二个参数是调用的方法

call.setOperationName(newQName("http://**","method"));

System.out.println(call.getTargetEndpointAddress());

Stringresult=(String)call.invoke(newObject[]{name});

System.out.println(result);

}catch(Exceptione){

e.printStackTrace();

}

}

}

2.rpc调用方式

import javax.xml.namespace.QName;

importorg.apache.axis2.addressing.EndpointReference;

importorg.apache.axis2.client.Options;

importorg.apache.axis2.rpc.client.RPCServiceClient;

publicclassRPCClient

{

publicstaticvoidmain(String[]args)throwsException

{

//使用RPC方式调用WebService

RPCServiceClientserviceClient=newRPCServiceClient();

Optionsoptions=serviceClient.getOptions();

//指定调用WebService的URL

EndpointReferencetargetEPR=newEndpointReference(

"http://**/Service");

options.setTo(targetEPR);

//指定访问方法的参数值

Object[]ob=newObject[]{"fei"};

//指定访问方法返回值的数据类型的Class对象

Class[]classes=newClass[]{String.class};

//指定要调用的方法及WSDL文件的命名空间

//QName第一个参数为命名空间即文件中xschema中targetnamespace的值

QNameqob=newQName("**","method");

//调用访问方法并输出该方法的返回值

System.out.println(serviceClient.invokeBlocking(qob,ob,classes)[0]);

}

}

 CXF客户端对对CXF服务器的访问,很简单。

JaxWsProxyFactoryBean jaxfactory = new JaxWsProxyFactoryBean();

jaxfactory.getInInterceptors().add(newLoggingInInterceptor());

jaxfactory.getOutInterceptors().add(newLoggingOutInterceptor());

jaxfactory.setServiceClass(*Service.class);

jaxfactory.setAddress("http://*/service?wsdl");

  *Service client = (*Service)jax factory.create();

client.method("参数");

这里说的CXF客户端访问是不需要axis的类接口的,是通过动态创建客户端来实现的。

这里注意CXF中cxf版本和jaxb的版本匹配,否则会出现无法创建的错误java.lang.reflect.UndeclaredThrowableException等异常。

import org.apache.cxf.endpoint.Client;

importorg.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;

publicclasstestClient{

privatetestClient(){

}

publicstaticvoidmain(Stringargs[]){

ClassLoadercl=Thread.currentThread().getContextClassLoader();

JaxWsDynamicClientFactorydcf=JaxWsDynamicClientFactory.newInstance();

Clientclient=dcf.createClient("http:**/*service?wsdl");

Thread.currentThread().setContextClassLoader(cl);

  try {

//invoke第一个参数是方法名称,第二个是参数

Object[]objects=client.invoke("method","fei");

System.out.println("返回对象的长度:"+objects.length);

System.out.println(objects[0].toString());

}catch(Exceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}

}

相关推荐