Maven+SpringMVC+CXF整合實現webservice服務的釋出與呼叫
今天有時間把之前遺留的內容給寫一下,一直想把webservice服務的釋出整合說一下,但是總是忘記了,最近有做了一些關於這一塊的東西,就總結下,來記錄一下。
簡述: WebService開源框架的選擇, 目前主流的Web Service框架主要有3種: Axis 2, CXF, 和 Spring WS
這裡我們 基於CXF建立WebService。
1、webservice服務的簡單釋出實現,如程式碼:這裡不用web專案,直接用java專案釋出
(1)、介面類:
(2)、實現類如:
(3)、釋出服務:
2、使用web專案整合CXF來實現webservice服務的釋出。
1、首先我們需要新增CXF外掛包的依賴,我的版本是:2.6.17
<!-- webservice依賴框架CXF --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>${cxf.version}</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId> <version>${cxf.version}</version> </dependency> <!-- webservice依賴框架CXF -->
2、新增配置檔案spring-cxf.xml 具體內容為:
上圖中的cxf.xml 和cxf-servlet.xml等這些東西都是在我們引用的包裡面,我們只需要將這些檔案新增並引進來就可以了,不需要管這些檔案在啥位置,cxf.xml是在cxf-core核心檔案中。。。。。
3、然後修改web.xml資訊,啟動載入該spring-cxf.xml檔案。
這裡需要具體的說一下:因為我在這裡跌了一跤:因為我們是SpringMVC專案,我們用的轉發器是DispatcherServlet,載入spring配置檔案就是用的這個。一開始我是這樣寫的,我載入的spring配置檔名為dispatcher-servlet.xml ,所以我就把spring-cxf.xml引進到了dispatcher-servlet.xml中。如圖:
在我啟動的之後訪問我的webservice介面服務,直接給出:no services have been found.,沒有發現服務,明明啟動了服務,而且也正常釋出了但就是沒有。為啥呢?
原因就是:Spring MVC是通過DispatcherServlet來載入Spring配置檔案的,因此不需要在web.xml中配置ContextLoaderListener。但是CXF卻需要通過ContextLoaderListener來載入Spring。這樣就產生了一個矛盾,如果不配置ContextLoaderListener,CXF就無法正常使用。但如果配置ContextLoaderListener,又會造成Spring的重複載入(DispatcherServlet一次,ContextLoaderListener一次)
為了同時能夠實現使用兩個載入器,又能夠不重複載入,我們需要將兩者的配置檔案分離開來。這也是我們為啥將spring-cxf.xml分離開dispatcher-servlet.xml來寫。
配置方式如下:
啟動之後如圖:
從上面我們可以清楚看到,每個檔案都只加載了一次。
我們還要看下他的wsdl檔案:如:
看到這個的時候我們的服務就算髮布完成了。
3、實現客戶端的呼叫:
我們呼叫webservice服務,需要獲取到他的樁程式碼,如何獲取他的樁程式碼呢?
1、服務釋出之後會給出一個服務的詳細資訊,我們能獲取他的服務連線(wsdl連線)
如:http://localhost:8080/demo/webService/helloService?wsdl 能夠檢視這個描述檔案。或者獲取到一個.wsdl 為字尾的檔案,內容和上面的描述是一樣的。然後我們根據 這些東西來生成我們的樁程式碼。如圖:
具體流程可以參考:http://www.cnblogs.com/leihenqianshang/articles/5572941.html
2、實現呼叫:
程式碼如:
package com;
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
import com.zpl.webservice.cxf.ISayHello;
/**
* 實現如何呼叫webservice介面服務
* @author zhangpengliang
*
*/
public class Test01 {
public static void main(String[] args) throws MalformedURLException {
String nameSpace="http://cxf.webservice.zpl.com/";
URL url=new URL("http://localhost:8080/demo/webService/helloService?wsdl");
//WebService服務類註解@WebService引數serviceName的值
final QName SERVICE_NAME = new QName(nameSpace, "SayHelloImplService");
//WebService服務類註解@WebService引數name的值+”Port”
final QName PORT_NAME = new QName(nameSpace, "SayHelloImplPort");
//獲取介面例項類
javax.xml.ws.Service service=javax.xml.ws.Service.create(url, SERVICE_NAME);
ISayHello inface=service.getPort(PORT_NAME, ISayHello.class);
inface.write("nihao");
}
}
到這裡基本就完了,但是補充一點知識,也是專案中遇到的:
在我們生成webservice服務的時候,生成的wsdl檔案內容必須按照某種格式(客戶要求的,沒辦法)。有一次,客戶要求生成的wsdl檔案中所用的實體物件屬性名稱必須大寫。
介面方法中引用了某個例項物件,含有屬性值name ,一般會顯示大寫,但是有時候就是小寫
所以我們需要這樣做:
暫時就這些了吧。。。。。。。。。。