使用CXF发布和调用webservice之HelloWorld入门

本文介绍如何使用CXF框架发布和调用WebService。包括创建接口、实现类和服务发布方式,同时提供客户端调用示例及通过WSDL动态调用的方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

依赖的JAR
    cxf-2.2.10.jar
    jetty-6.1.21.jar
    jetty-util-6.1.21.jar
    servlet-2_5-api.jar
    wsdl4j-1.6.2.jar
    XmlSchema-1.4.5.jar
创建一个普通的Java工程即可

创建webservice接口
package  com.cxf.interfaces;

import  javax.jws.WebParam;
import  javax.jws.WebService;

@WebService
public   interface  HelloWorldServiceInf {
    
    String sayHello(@WebParam(name = " username " ) String username);
    
}
发布和调用webservice
        方法一
发布webservice
package  com.cxf.impl;

import  javax.jws.WebService;

import  org.apache.cxf.interceptor.LoggingInInterceptor;
import  org.apache.cxf.interceptor.LoggingOutInterceptor;
import  org.apache.cxf.jaxws.JaxWsServerFactoryBean;

import  com.cxf.interfaces.HelloWorldServiceInf;

@WebService(endpointInterface = " com.cxf.interfaces.HelloWorldServiceInf " ,serviceName = " helloWorldService " )
public   class  Server  implements  HelloWorldServiceInf {

     public  String sayHello(String username) {
         return   " Hello, " + username;
    }

    
     public   static   void  main(String[] args) {
        Server impl = new  Server();
        JaxWsServerFactoryBean factoryBean = new  JaxWsServerFactoryBean();
        factoryBean.setAddress( " http://localhost:9000/hello " );
        factoryBean.setServiceClass(HelloWorldServiceInf. class );
        factoryBean.setServiceBean(impl);
        factoryBean.getInInterceptors().add( new  LoggingInInterceptor());
        factoryBean.getOutInterceptors().add( new  LoggingOutInterceptor());
        factoryBean.create();
    }
    
}
wsdl描述文件
   <? xml version="1.0"  ?>  
-  < wsdl:definitions  name ="HelloWorldServiceInfService"  targetNamespace ="http://interfaces.cxf.com/"  xmlns:ns1 ="http://schemas.xmlsoap.org/wsdl/soap/http"  xmlns:soap ="http://schemas.xmlsoap.org/wsdl/soap/"  xmlns:tns ="http://interfaces.cxf.com/"  xmlns:wsdl ="http://schemas.xmlsoap.org/wsdl/"  xmlns:xsd ="http://www.w3.org/2001/XMLSchema" >
-  < wsdl:types >
-  < xsd:schema  attributeFormDefault ="unqualified"  elementFormDefault ="unqualified"  targetNamespace ="http://interfaces.cxf.com/"  xmlns:tns ="http://interfaces.cxf.com/"  xmlns:xsd ="http://www.w3.org/2001/XMLSchema" >
   < xsd:element  name ="sayHello"  type ="tns:sayHello"   />  
-  < xsd:complexType  name ="sayHello" >
-  < xsd:sequence >
   < xsd:element  minOccurs ="0"  name ="username"  type ="xsd:string"   />  
   </ xsd:sequence >
   </ xsd:complexType >
   < xsd:element  name ="sayHelloResponse"  type ="tns:sayHelloResponse"   />  
-  < xsd:complexType  name ="sayHelloResponse" >
-  < xsd:sequence >
   < xsd:element  minOccurs ="0"  name ="return"  type ="xsd:string"   />  
   </ xsd:sequence >
   </ xsd:complexType >
   </ xsd:schema >
   </ wsdl:types >
-  < wsdl:message  name ="sayHelloResponse" >
   < wsdl:part  element ="tns:sayHelloResponse"  name ="parameters"   />  
   </ wsdl:message >
-  < wsdl:message  name ="sayHello" >
   < wsdl:part  element ="tns:sayHello"  name ="parameters"   />  
   </ wsdl:message >
-  < wsdl:portType  name ="HelloWorldServiceInf" >
-  < wsdl:operation  name ="sayHello" >
   < wsdl:input  message ="tns:sayHello"  name ="sayHello"   />  
   < wsdl:output  message ="tns:sayHelloResponse"  name ="sayHelloResponse"   />  
   </ wsdl:operation >
   </ wsdl:portType >
-  < wsdl:binding  name ="HelloWorldServiceInfServiceSoapBinding"  type ="tns:HelloWorldServiceInf" >
   < soap:binding  style ="document"  transport ="http://schemas.xmlsoap.org/soap/http"   />  
-  < wsdl:operation  name ="sayHello" >
   < soap:operation  soapAction =""  style ="document"   />  
-  < wsdl:input  name ="sayHello" >
   < soap:body  use ="literal"   />  
   </ wsdl:input >
-  < wsdl:output  name ="sayHelloResponse" >
   < soap:body  use ="literal"   />  
   </ wsdl:output >
   </ wsdl:operation >
   </ wsdl:binding >
-  < wsdl:service  name ="HelloWorldServiceInfService" >
-  < wsdl:port  binding ="tns:HelloWorldServiceInfServiceSoapBinding"  name ="HelloWorldServiceInfPort" >
   < soap:address  location ="http://localhost:9000/hello"   />  
   </ wsdl:port >
   </ wsdl:service >
   </ wsdl:definitions >
客户端调用
package  com.cxf.client;

import  org.apache.cxf.interceptor.LoggingInInterceptor;
import  org.apache.cxf.interceptor.LoggingOutInterceptor;
import  org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import  com.cxf.interfaces.HelloWorldServiceInf;

public   class  Client {
     public   static   void  main(String[] args) {
        JaxWsProxyFactoryBean  factoryBean = new  JaxWsProxyFactoryBean();
        factoryBean.getInInterceptors().add( new  LoggingInInterceptor());
        factoryBean.getOutInterceptors().add( new  LoggingOutInterceptor());
        factoryBean.setServiceClass(HelloWorldServiceInf. class );
        factoryBean.setAddress( " http://localhost:9000/hello " );
        HelloWorldServiceInf impl = (HelloWorldServiceInf) factoryBean.create();
        System.out.println(impl.sayHello( " 张三 " ));
    }
}
        方法二
发布webservice
package  com.cxf.impl;

import  javax.jws.WebService;
import  javax.xml.ws.Endpoint;

import  com.cxf.interfaces.HelloWorldServiceInf;

@WebService(endpointInterface = " com.cxf.interfaces.HelloWorldServiceInf " ,serviceName = " helloWorldService " )
public   class  Server  implements  HelloWorldServiceInf {

     public  String sayHello(String username) {
         return   " Hello, " + username;
    }
     public   static   void  main(String[] args) {
        Server impl = new  Server();
        String address = " http://localhost:9000/hello " ;
        Endpoint.publish(address, impl);
    }
}
wsdl文件
   <? xml version="1.0"  ?>  
-  < wsdl:definitions  name ="helloWorldService"  targetNamespace ="http://impl.cxf.com/"  xmlns:ns1 ="http://interfaces.cxf.com/"  xmlns:ns2 ="http://schemas.xmlsoap.org/wsdl/soap/http"  xmlns:soap ="http://schemas.xmlsoap.org/wsdl/soap/"  xmlns:tns ="http://impl.cxf.com/"  xmlns:wsdl ="http://schemas.xmlsoap.org/wsdl/"  xmlns:xsd ="http://www.w3.org/2001/XMLSchema" >
   < wsdl:import  location ="http://localhost:9000/hello?wsdl=HelloWorldServiceInf.wsdl"  namespace ="http://interfaces.cxf.com/"   />  
-  < wsdl:binding  name ="helloWorldServiceSoapBinding"  type ="ns1:HelloWorldServiceInf" >
   < soap:binding  style ="document"  transport ="http://schemas.xmlsoap.org/soap/http"   />  
-  < wsdl:operation  name ="sayHello" >
   < soap:operation  soapAction =""  style ="document"   />  
-  < wsdl:input  name ="sayHello" >
   < soap:body  use ="literal"   />  
   </ wsdl:input >
-  < wsdl:output  name ="sayHelloResponse" >
   < soap:body  use ="literal"   />  
   </ wsdl:output >
   </ wsdl:operation >
   </ wsdl:binding >
-  < wsdl:service  name ="helloWorldService" >
-  < wsdl:port  binding ="tns:helloWorldServiceSoapBinding"  name ="ServerPort" >
   < soap:address  location ="http://localhost:9000/hello"   />  
   </ wsdl:port >
   </ wsdl:service >
   </ wsdl:definitions >
客户端调用
package  com.cxf.client;

import  javax.xml.namespace.QName;
import  javax.xml.ws.Service;
import  javax.xml.ws.soap.SOAPBinding;

import  com.cxf.interfaces.HelloWorldServiceInf;

public   class  Client {
     // 注意:此处http: // interfaces.cxf.com/  来源于wsdl文件中namespace   <wsdl:import location=" http://localhost :9000/hello?wsdl=HelloWorldServiceInf.wsdl" namespace=" http://interfaces.cxf.com/ " /> 

     private   static   final  QName SERVICE_NAME = new  QName( " http://interfaces.cxf.com/ " , " HelloWorldServiceInf " ); // HelloWorldServiceInf接口类的名称
     private   static   final  QName PORT_NAME = new  QName( " http://interfaces.cxf.com/ " ,  " HelloWorldServiceInfPort " ); // HelloWorldServiceInfPort 接口类的名称+Port
     public   static   void  main(String[] args) {
        String endPointAddress = " http://localhost:9000/hello " ;
        Service service = Service.create(SERVICE_NAME);
        service.addPort(PORT_NAME, SOAPBinding.SOAP11HTTP_BINDING, endPointAddress);
        HelloWorldServiceInf inf = service.getPort(HelloWorldServiceInf. class );
        System.out.println(inf.sayHello( " 张三 " ));
    }
}
CXF根据wsdl文件动态调用WebService
package  com.cxf.client;

import  org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;

public   class  ClientFromWsdl {
    
     public   static   void  main(String[] args)  throws  Exception{
        JaxWsDynamicClientFactory dcf  =  JaxWsDynamicClientFactory.newInstance();
        org.apache.cxf.endpoint.Client client  =  dcf.createClient( " http://localhost:9000/hello?wsdl " );
         // sayHello 为接口中定义的方法名称   张三为传递的参数   返回一个Object数组
        Object[] objects = client.invoke( " sayHello " ,  " 张三 " ); 
         // 输出调用结果
        System.out.println(objects[ 0 ].toString());
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值