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();
}
}
}