现在的位置: 首页 > 综合 > 正文

CXF的三种发布方式和客户端调用方法         CXF的三种发布方式和客户端调用方法        

2018年05月22日 ⁄ 综合 ⁄ 共 4481字 ⁄ 字号 评论关闭
    

        CXF的三种发布方式和客户端调用方法        
    

        分类:            
Java            
webservice        
         
18人阅读
     评论(0)    
收藏    
举报    

先定义一个web service

  1. @WebService(targetNamespace="http://www.itfad.net/queryUser")  
  2. public interface IQueryUser  
  3. {  
  4.     String query(@WebParam(name = "user") UserInfo user);  
  5. }  

实现类:

  1. @WebService(endpointInterface="net.itfad.services.IQueryUser")  
  2. public class QueryUserImpl implements IQueryUser  
  3. {  
  4.     public String query(UserInfo user)  
  5.     {  
  6.         if (user == null)  
  7.             throw new IllegalArgumentException("参数user不能为null");  
  8.         return "your name is " + user.getUserName();  
  9.     }  
  10. }  

web service发布方式
第一种,使用jax-ws方式,非常简单
String url="http://localhost:8080/queryUser;
Endpoint.publish(url, new QueryUserImpl);

第二种,CXF方式

  1. String url="http://localhost:8080/queryUser";  
  2. JaxWsServerFactoryBean factoryBean=new JaxWsServerFactoryBean();  
  3. factoryBean.setAddress(url);  
  4. factoryBean.setServiceClass(IQueryUser.class);  
  5. factoryBean.setServiceBean(new QueryUserImpl());  
  6. factoryBean.create()  

第三种,CXF Simple FrontEnd方式
该方式无需在类中指定相关协议,也就是说不需要在类中指定相关webservice注解,一个普通类就行

  1. ServerFactoryBean svrFactory = new ServerFactoryBean();  
  2. //设置服务接口类  
  3. svrFactory.setServiceClass(IQueryUser.class);  
  4. svrFactory.setAddress("http://localhost:8080/queryUser");  
  5. //设置服务实现接口类  
  6. svrFactory.setServiceBean(QueryUserImpl);  
  7. svrFactory.create();  

客户端调用web service方法
首先要使用cxf的wsdl2java命令工具生成服务代理类,如:wsdl2java -p com.charles.client http://localhost:8080/queryUser?wsdl
具体命令格式可使用wsdl2java /?查看。生成后的代理类名是:服务实现类名+Service

方法一:使用标准的JAX-WS的API完成客户端调用

//注意。此处http:http://www.itfad.net/queryUser是服务的命名空间,可查看wsdl文件中的targetNamespace

QName qName = new QName("http://www.itfad.net/queryUser","QueryUserImplService");
QueryUserImplService ImplService =new QueryUserImplService(new URL("http://localhost:8080/CXFDemo/queryUser?wsdl"),qName);
IQueryUser service=(IQueryUser)ImplService.getPort(IQueryUser.class);

方法二:javax.xml.ws.Service

String endPointAddress = "http://localhost:8080/queryUser";//服务实际地址
//此处http://charles.com/为命名空间,默认是包名的倒序。IQueryUserService=服务接口名+service
javax.xml.ws.Service service = javax.xml.ws.Service.create(new QName("http://charles.com/","IQueryUserService"));
//IQueryUserPort=服务接口名+Port
service.addPort(new QName("http://charles.com/","IQueryUserPort"),javax.xml.ws.soap.SOAPBinding.SOAP11HTTP_BINDING, endPointAddress);
IQueryUser queryService1 =service.getPort(IQueryUser.class);

System.out.println(queryService1.query(user));

这里其实利用wsdl2java工具为我们生成类时已经包含了这种方法。比如我们的服务接口是IQueryUser,那么我们会发现生成的文件下有个IQueryUserService类
该类正是继承至javax.xml.ws.Service,并封装以上代码的功能,调用代码如下:
IQueryUserService queryUserService=new IQueryUserService();//默认构造函数里使用默认wsdl地址和服务的QName
IQueryUser queryService1 =queryUserService.getIQueryUserPort();//方法内部调用了super.getPort(IQueryUserPort, IQueryUser.class);
System.out.println(queryService1.query(user));

 方法三:使用CXF中JaxWsProxyFactoryBean客户端代理工厂调用web服务

JaxWsProxyFactoryBean soapFactoryBean = newJaxWsProxyFactoryBean();
soapFactoryBean.setAddress("http://localhost:8080/queryUser");
soapFactoryBean.setServiceClass(IQueryUser.class);
Object o = soapFactoryBean.create();
IQueryUser service = (IQueryUser)o;

方法四:使用CXF的JaxWsDynamicClientFactory动态代理工厂

JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
Client client = dcf.createClient("people.wsdl", classLoader);
Object person =Thread.currentThread().getContextClassLoader().loadClass("com.acme.Person").newInstance();
Method m = person.getClass().getMethod("setName", String.class);
m.invoke(person, "Joe Schmoe");
client.invoke("addPerson", person);

抱歉!评论已关闭.