1. 程式人生 > >Maven+SpringMVC+CXF整合實現webservice服務的釋出與呼叫

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 ,一般會顯示大寫,但是有時候就是小寫


所以我們需要這樣做:


暫時就這些了吧。。。。。。。。。。