1. 程式人生 > >WebService中CXF的簡單的配置和應用(ssm框架)

WebService中CXF的簡單的配置和應用(ssm框架)

在學習java的過程中,會涉及到系統間的通訊,兩個系統之間的互動通訊,也可以認為是一個系統釋出服務,另外一個系統呼叫服務,其中我採用的是http協議進行通訊,資料的序列化和反序列化都由CXF來完成,呼叫的服務返回什麼就接收什麼,作為程式設計師只需要關注自己的業務邏輯即可。下面將會說一下如何使用CXF及實現的過程中的一些配置。

第一:導包

<dependency>
   <groupId>org.apache.cxf</groupId>
   <artifactId>cxf-rt-frontend-jaxws</artifactId>
   <version>3.1.10</version>
</dependency>
<dependency>
   <groupId>org.apache.cxf</groupId>
   <artifactId>cxf-rt-transports-http</artifactId>
   <version>3.1.10</version>
</dependency>

將這兩個包納入進classpath下就可以了。這樣就完成了第一步的操作(至於還要依賴spring的包,我不怎麼了解)

第二:在服務端釋出服務,這個過程是比較細的,不像是客戶端呼叫那麼簡單,釋出出去的服務為一個介面。分別說一下

1.在web.xml中配置如下資訊: 

<servlet>
   <servlet-name>CXFServlet</servlet-name>
   <servlet-class>
       org.apache.cxf.transport.servlet.CXFServlet
   </servlet-class>
   <load-on-startup>1</load-on-startup>
</servlet>
 <servlet-mapping>
   <servlet-name>CXFServlet</servlet-name>
   <url-pattern>/p/*</url-pattern>
</servlet-mapping>
    這就是CXF的servlet。這是在服務端中web.xml中配置的,客戶端是不需要配置的。

2.配好web.xml後繼續配置cxf.xml

<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:jaxws="http://cxf.apache.org/jaxws" 
xsi:schemaLocation=" http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd 
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
    
    <import resource="classpath:META-INF/cxf/cxf.xml"/>
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
    
    <jaxws:endpoint id="myService" implementor="com.my.send.service.impl.MyServiceImpl" address="/sendMail"/>


</beans>

解釋一下藍色字型的意思,其他的都是模板中,或者說是quickstart。endpoint id="myService";其中的id是可以隨便起的,這個我現在麼有用到。關鍵是後面的implementor一看便知是實現類。如下圖所示:為src/main/java中的包。其中包含實現類和介面。

配置好spring-cxf.xml後將這個xml匯入到spring-config.xml中,目的是隨著spring的載入同時載入。

如上所示就配置好了cxf.xml的一些配置。

3.服務端介面的處理和實現類的處理

如上圖所示的,一個是提供服務的介面,一個是介面的實現類。介面中要寫上一個標籤:

同樣的在實現類中也有實現加入同樣的標籤:


加入的標籤為上圖所示.其中webservice中加了一個endpointInterface"";這其中的意思就是介面的終點。把包名和類名加入就可以。(包名+介面名)。這步完成,服務端的配置也就完了。這其中的一些業務邏輯根據個人需求寫。

第三步:配置客戶端的CXF。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:jaxws="http://cxf.apache.org/jaxws"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
 
    <jaxws:client id="myService"
                  serviceClass="com.my.send.service.MyService"
                  address="http://192.168.0.101:8083/p/sendMail"/>

</beans>

解釋一些圖中藍色的字型所表示的意思:客戶端也需要同樣的包名和介面名,address中的內容為服務端的地址,通過http通訊,其中/p/sendMail是請求服務端中web.xml中的CXFservlet。sendMail是自定義的,在服務端的cxf中可以看到。下圖為客戶端的包名和介面名。要嚴格與服務端的介面和包名保持一致,包括裡面的介面方法。


配置好後需要在客戶端中的介面處加上webservcie標籤:如下圖所示


完成上面的所有步驟就完成了一個完整的CXF的簡單配置。其中服務端的POM.xml中的配置如下圖所示,箭頭所指的地方不寫內容,當然也可以不加這個標籤。


。下面就是啟動兩個系統了。經過一些配置,在服務端的方法,被客戶端呼叫的時候就像是呼叫自己的方法一樣,有返回值為String的話直接接受即可。下圖為測試的結果

致此整個CXF的簡單應用就完成了。

額外補充

 如果服務端返回的是一ArrayList集合的話,並且集合中放的是一個類:如User這個類包含很多的屬性。將物件的屬性賦值後,最後將物件放入集合中返回給客戶端。這個返回的過程中,當客戶端是需要接受的時候。這個接受過程中也是有講究的,如下圖在服務端中建立一個user的domain類

在客戶端呼叫的時候返回的是一個集合,集合中放的是一個user或多個user,那你在客戶端也需要寫相同的User類至於包名可以不同,其實就是一個實體類的對映關係。返回的集合中的泛型為User,這個是User中的屬性和服務端的User中的屬性是一致命的。否則會報錯。。總之:User要把它看成是同一個類在不同包中就可以了。