1. 程式人生 > >CXF與Spring整合

CXF與Spring整合


      WebService的主要目標是跨平臺的可互操作性。為了達到這一目標,WebService完全基於XML(可擴充套件標記語言)、XSD(XMLSchema)等獨立於平臺、獨立於軟體供應商的標準,是建立可互操作的、分散式應用程式的新平臺。簡單的說WebService就是一個應用程式,它向外界提供了一個能夠通過Web進行呼叫的API。這就是說,你能夠用程式設計的方法通過Web呼叫來實現某個功能的應用程式。

 

      CXF一個Apache開源的WebService框架,它實現了JCP與Web Service中一些重要標準。CXF簡化了構造,整合,面向服務架構(SOA)業務元件與技術的靈活複用。SOA(Service-Oriented Architecture)面向服務架構是一種思想,它將應用程式的不同功能單元通過中立的契約(獨立於硬體平臺、作業系統和程式語言聯絡起來,使得各種形式的功能單元更好的整合。目前來說,WebService 是SOA 的一種較好的實現方式,WebService 採用HTTP 作為傳輸協議,SOAP(Simple Object Access Protocol)作為傳輸訊息的格式。

 

      在CXF中,Service使用WSDL標準定義並能夠使用各種不同的訊息 格式(或binding)和網路協議(transports)包括SOAP、XML(通過HTTP或JMS)進行訪問。CXF同樣支援多種model 如:JAX-WS,JBI,SCA和CORBA service。CXF設計成可靈活部署到各種容器中包括Spring-based,JBI,SCA, Servlet和J2EE容器。

 

熟悉了WebService的基礎知識之後,入門CXF框架比較簡單。CXF與Spring進行整合使用,大大的簡化了開發工作。下面就拿HelloWorld來介紹CXF及WebService的基礎性東西;

一、環境說明

  1、Spring的環境搭建,這裡就不在說了。這裡使用的spring2.5

  

  2、下載CXF,這裡使用最新版本apache-cxf-2.6.2

 

 二 搭建CXF並與Spring進行整合

    1、所需的CXF的jar

 

    

    2、配置web.xml檔案

 

 

 

Java程式碼   收藏程式碼
  1.     <!--配置CXFServlet begin-->  
  2. <servlet>  
  3.     <servlet-name>CXFServlet</servlet-name>  
  4.     <display-name>CXF Servlet</display-name>  
  5.     <servlet-class>  
  6.         org.apache.cxf.transport.servlet.CXFServlet  
  7.     </servlet-class>  
  8.     <load-on-startup>1</load-on-startup>  
  9. </servlet>  
  10. <servlet-mapping>  
  11.     <servlet-name>CXFServlet</servlet-name>  
  12.     <!-- url可自定義配置,用於CXFServlet請求地址攔截,訪問會用到 -->  
  13.     <url-pattern>/webservice/*</url-pattern>  
  14. </servlet-mapping>  
  15. <!--配置CXFServlet end -->  
 

 

  

3、Web 服務的介面定義HelloWorld.java

 

 

Java程式碼   收藏程式碼
  1. @WebService(serviceName="HelloWorld",targetNamespace=Constants.WS_NAMESPACE)  
  2. public interface HelloWorld {  
  3.   
  4.     @WebMethod  
  5.     public String say(@WebParam(name="name")String name);  
  6.       
  7.     @WebMethod  
  8.     public String sayHello(@WebParam(name="user")User user);  
  9.       
  10.     @WebMethod  
  11.     public List<User> getList(Long id);  
  12. }         

 

 

 

 

 4、Web服務介面實現類 HelloWorldImpl.java

 

 

Java程式碼   收藏程式碼
  1.                      @Service("HelloWorldImpl")  
  2. public class HelloWorldImpl implements HelloWorld {  
  3.     public String say(String name) {  
  4.             return name+",您好!";  
  5.     }  
  6.   
  7.     public String sayHello(User user) {  
  8.         return user.getName()+",您好!";  
  9.     }  
  10.       
  11.     public List<User> getList(Long id){  
  12.         List<User> list = new ArrayList<User>();  
  13.         User user= new User();  
  14.         Long sid=1L;  
  15.         user.setId(sid);  
  16.         user.setName("張三"+sid);  
  17.         list.add(user);  
  18.           
  19.         user= new User();  
  20.         sid=2L;  
  21.         user.setId(sid);  
  22.         user.setName("張三"+sid);  
  23.         list.add(user);  
  24.   
  25.         return list;  
  26.     }  
  27. }  
 

注意:看到很多Web服務介面的實現類標註了 @WebService註解,我在這測試了實現類不標註該註解及@WebMethod正常。還沒有看到具體文件

 

5、傳遞物件Customer的PO類定義

                       

 

Java程式碼   收藏程式碼
  1. @XmlRootElement(name="User")  
  2.             @XmlAccessorType(XmlAccessType.FIELD)  
  3.             @XmlType(name="User")  
  4.             public class User{  
  5.                   
  6.                 @XmlElement(nillable=true)  
  7.                 private Long id;  
  8.                   
  9.                 @XmlElement(nillable=true)  
  10.                 private String name;  
  11.                   
  12.                 @XmlElement(nillable=true)  
  13.                 private int age;  
  14.               
  15.                 public Long getId() {  
  16.                     return id;  
  17.                 }  
  18.               
  19.                 public void setId(Long id) {  
  20.                     this.id = id;  
  21.                 }  
  22.               
  23.                 public String getName() {  
  24.                     return name;  
  25.                 }  
  26.               
  27.                 public void setName(String name) {  
  28.                     this.name = name;  
  29.                 }  
  30.               
  31.                 public int getAge() {  
  32.                     return age;  
  33.                 }  
  34.               
  35.                 public void setAge(int age) {  
  36.                     this.age = age;  
  37.                 }  
  38.             }                     
  39.       
 

 

 

這裡使用很多註解,對於這些註解請參考 WebService註解詳細 

 

 

6、CXF的Spring配置檔案appCtx-cxf.xml

 

 

Java程式碼   收藏程式碼
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.     <beans xmlns="http://www.springframework.org/schema/beans"  
  3.         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.         xmlns:jaxws="http://cxf.apache.org/jaxws"  
  5.         xsi:schemaLocation=" http://www.springframework.org/schema/beans                       
  6.                         http://www.springframework.org/schema/beans/spring-beans.xsd                         
  7.                         http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">  
  8.         <import resource="classpath:META-INF/cxf/cxf.xml" />  
  9.         <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />  
  10.         <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />  
  11.           
  12.           
  13.         <bean id="inMessageInterceptor" class="org.apache.cxf.interceptor.LoggingInInterceptor" />  
  14.         <bean id="outMessageInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>  
  15.           
  16.         <!--implementor:指定介面具體實現類,address:隨意配-->  
  17.         <jaxws:endpoint id="helloWorld"  implementor="#HelloWorldImpl" address="/HelloWorld"  >  
  18.             <!-- 輸入日誌攔截器 -->  
  19.            <jaxws:inInterceptors>  
  20.                 <ref bean="inMessageInterceptor"/>  
  21.            </jaxws:inInterceptors>  
  22.            <!-- 輸出日誌攔截器 -->  
  23.            <jaxws:outInterceptors>  
  24.               <ref bean="outMessageInterceptor"/>  
  25.            </jaxws:outInterceptors>  
  26.         </jaxws:endpoint>  
  27.         <!-- WebService 客戶端 spring 配置檔案cxf與Spring整合,cxf裡提供了一個工廠類org.apache.cxf.jaxws.JaxWsProxyFactoryBean,  
  28.         可以方便實現的呼叫WebService。serviceClass屬性是介面類,address是webService的路徑在其他bean裡如果要呼叫webservice,  
  29.         只要將client這個bean注入到需要使用的bean裡。-->  
  30.         <bean id="client" class="com.exp.service.outer.HelloWorld" factory-bean="clientFactory" factory-method="create" />  
  31.         <bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">  
  32.             <property name="serviceClass" value="com.exp.service.outer.HelloWorld" />  
  33.             <property name="address" value="http://localhost:8080/demo/webservice/HelloWorld" />  
  34.         </bean>  
  35.     </beans>        
 

 

 

7、執行伺服器

   訪問http://localhost:8080/demo/webservice/HelloWorld?wsdl 地址,您會看到很長的XML檔案

 

     看到的XML一大堆,不容易明白。具體解釋參考 WSDL解釋

   

8、客戶端測試

    

 

Java程式碼   收藏程式碼
  1. public class HelloWorldClient {  
  2.                 public static void main(String[] args) {  
  3.                     ApplicationContext context = new ClassPathXmlApplicationContext(  
  4.                             new String[] { "classpath*:/config/spring_cfg/appCtx-*.xml" });  
  5.                     HelloWorld client = (HelloWorld) context.getBean("client");  
  6.                     System.out.println(client.say("ABC"));  
  7.                       
  8.                     User user= new User();  
  9.                     customer.setName("張三");  
  10.                     System.out.println(client.sayHello(customer));  
  11.                       
  12.                     List<User> list = client.getList(1L);  
  13.                     for(User c:list){  
  14.                         System.out.println(c.getName());  
  15.                     }  
  16.                 }  
  17.             }