1. 程式人生 > >eclipse開發webservice-axis2/spring+maven

eclipse開發webservice-axis2/spring+maven

前言

本文將講述使用eclipse釋出axis2服務的環境準備到釋出過程。

1、基礎準備

eclipse需要兩個外掛(eclipse_axis2-外掛-直接解壓到dropins)

然後是axis2的war包和bin包,前者我們可以直接看到axis2服務啟動的樣子,並且把我們的webservice服務直接新增到這個axis2專案中,後面的bin包則直接為eclipse開發

axis2提供了環境支援。

axis2的war和bin下載(當然你也可以從apache的官網下載較新版本)

下載地址

你本地需要有可以啟動的伺服器,我這裡是tomcat

2、解壓axis2-1.7.4-war.zip和axis2-1.7.4-bin.zip

得到axis2.war和axis2-1.7.4

對於axis2.war的處理

放到tomcat伺服器webapps下啟動

訪問 http://localhost:8080/axis2/


點選Administration ,右面有個username和password,這是axis2提供的demo的管理員登陸頁,預設是  admin/axis2

如果是生產環境一定記得修改,位置為axis2\WEB-INF\conf\axis2.xml

點選Services,就可以看到axis2自帶的webservice服務了

對於axis2-1.7.4的處理

把axis2-1.7.4複製到某一個位置,比如你的D盤然後需要在3中設定了

3、在eclipse中配置axis2的開發環境


點選preferences
然後如上圖設定axis2的bin路徑,裡面的一些jar包等會為eclipse提供支援 eclipse中axis2的外掛

eclipse的兩個axis2的外掛解壓到eclipse/dropins,然後重啟eclipse

這樣,你的eclipse中就可以看到這兩個東西了,一個用於將java方法生成為服務端,一個則用於生成客戶端


4、下面將寫個簡單的例子

這個例子包含兩個部分,一是服務的釋出,二是服務的訪問

服務的釋出包含簡單方法的釋出和複雜方法的釋出

服務的訪問包含axis2客戶端訪問和axis2的RPC訪問

4.1 方法1-介面和介面的實現

介面類

package stu.demo.service;

public interface Axis2TestImpl {
	public String WriteStr(String str);
}

實現類,也是具體服務的釋出類
package stu.demo.service;

public class AxisTestService implements Axis2TestImpl {
	
	public String WriteStr(String str){
		System.out.println("您輸入的是:"+str);
		return str;
	}

}

4.2  使用axis2的外掛AxisTestService輸出為webservice服務

注意紅色方框圈中的區域,new來自於eclipse左上角的File


選擇服務所在專案的classes資料夾


一路點下去


繼續點


還點


再點一下,得到


Service name就是webservice的名字,Class name是方法所在類的路徑,然後按下Load,下面會顯示Method name,點next


那個location是檔案輸出路徑,你自定義的,下面File name是輸出檔案的名字(我這個文是後面寫的,所以名字和下面的配圖不一樣)

然後在你設定的位置得到下面的檔案(axis2test_service.aar)


4.3 把服務釋出到axis2.war中

還記得tomcat中的那個專案嗎

先停止tomcat伺服器

把axis2test_service.aar複製到axis2這個專案的axis2\WEB-INF\services\下

(記得把axis2.war刪除)

然後重啟tomcat

這樣你就已經把你剛寫的服務釋出到這個axis2中去了

訪問http://localhost:8080/axis2/services/listServices


4.4 編寫併發布另外兩個服務

剛才釋出的是一個以介面實現類形式展現的類,返回的是String型別,下面將釋出不實現任何介面的類,以及返回為實體型別的方法

釋出的方法不再贅述

不實現介面的類釋出為webservice服務

package stu.demo.noimpl;

public class Axis2NoImpl {
	
	public String  WriteYourName(String name){
		System.out.println("你輸入的名字為:"+name);
		return name;
	}

}

eclipse產生的對應的aar檔案為 axis2noImpl.aar


返回型別為實體類的釋出為webservice服務

需要實體類

package stu.demo.fz;

public class ModelUser {
	
	private String userName;
	private String userPwd;
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getUserPwd() {
		return userPwd;
	}
	public void setUserPwd(String userPwd) {
		this.userPwd = userPwd;
	}
	
	

}


然後是包含釋出方法的類

package stu.demo.fz;

public class Axis2Fz {
	public ModelUser WriteModelUser(ModelUser modelUser){
		System.out.println("你輸入的使用者名稱為:"+modelUser.getUserName());
		System.out.println("你輸入的密碼為:"+modelUser.getUserPwd());
		return modelUser;
	}
}

eclipse產生的對應的aar檔案為 axis2Fz.aar


4.5 axis2外掛生成客戶端訪問webservice



這裡涉及到要為哪一個webservice設定客戶端

所以先獲取webservice的wsdl地址

方法如下


如下


然後接著說eclipse的下一步


Next


Next


選擇輸出到向專案,然後直接選擇一個專案的路徑(到專案名字即可)

然後Finesh

得到客戶端


當然,如果你為複雜的返回型別那個生成客戶端,則會有一個實體類檔案生成


4.5 axis2的客戶端呼叫和RPC呼叫

這裡不贅述了了,直接把客戶端的呼叫方法和PRC的呼叫方法貼出來

需要注意的是,如果只是PRC呼叫的話,對於返回引數為某個實體類的話,需手動建立實體類檔案

需要強調的是,對於客戶端呼叫,其方法名字是和你呼叫的服務的類的名字息息相關的,但是大體思路是

例項化Stub  stub

例項化入參型別 入參

例項化返回型別 返回

返回=stub.方法(入參)

返回.getreturn()就是返回值

package stu.demo.test;

import java.rmi.RemoteException;

import javax.xml.namespace.QName;

import junit.framework.TestCase;

import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
import org.junit.Test;

import stu.demo.fz.xsd.ModelUser;
import stu.demo.noimpl.Axis2NoImplStub;
import stu.demo.noimpl.WriteYourName;
import stu.demo.noimpl.WriteYourNameResponse;

public class Axis2ClientNoImpl {
	/**
	 * 使用axis2客戶端呼叫
	 */
	@Test
	public void testAxis2NoImpl(){
		try {
			String name="Jecket";
//			Axis2NoImplStub Axis2NoImpl =new  Axis2NoImplStub();//這個方法訪問地址被封裝到了客戶端程式碼
			Axis2NoImplStub Axis2NoImpl =new  Axis2NoImplStub("http://localhost:8080/axis2/services/Axis2NoImpl.Axis2NoImplHttpSoap12Endpoint/");//如果生產地址和測試不一致,則需要指定,靈活運用
			
			WriteYourName writeYourName=new WriteYourName ();
			writeYourName.setName(name);
			
			WriteYourNameResponse writeYourNameResponse=new WriteYourNameResponse();
			
			writeYourNameResponse=Axis2NoImpl.writeYourName(writeYourName);
			
			TestCase.assertFalse("方法返回的名字和你輸入的名字不一致", writeYourNameResponse.get_return()==name);
		} catch (AxisFault e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * 使用axis2的RPC呼叫
	 */
	@Test
	public void testAxis2NoImpl2(){
		  String result = "";
		  try {

		   String serviceUrl = "http://localhost:8080/axis2/services/Axis2NoImpl?wsdl";
		   //使用RPC方式呼叫WebService
		   RPCServiceClient serviceClient = new RPCServiceClient();
		   Options options = serviceClient.getOptions();
		   //設定2秒超時
		   options.setTimeOutInMilliSeconds(2000L);
		   //指定呼叫WebService的URL
		   EndpointReference targetEPR = new EndpointReference(serviceUrl);
		   options.setTo(targetEPR);
		   
		   //指定介面方法的引數值
		   Object[] opAddEntryArgs = new Object[] {"Jecket"};
		   //指定方法返回值的資料型別的Class物件
		   Class[] classes = new Class[] { String.class };
		   //指定呼叫的方法及WSDL檔案的名稱空間  QName("targetNamespace","method Name");
		   QName qName = new QName("http://noimpl.demo.stu","WriteYourName");
		   //呼叫getVersioin方法並輸出該方法的返回值,
		   //返回物件是一個Object的陣列,拿陣列的第一個值,轉換強轉即可
		   result = serviceClient.invokeBlocking(qName,opAddEntryArgs, classes)[0].toString();
		  } catch (Exception e) {
		   e.printStackTrace();
		   result = e.getMessage();
		   
		  
		  }
		  System.out.println("返回值result="+result);
	}
	
	/**
	 * 使用axis2的RPC呼叫
	 * 入參和反參都是複雜型別
	 */
	@Test
	public void testAxis2Fz(){
		  String result = "";
		  try {

		   String serviceUrl = "http://localhost:8080/axis2/services/Axis2Fz?wsdl";
		   //使用RPC方式呼叫WebService
		   RPCServiceClient serviceClient = new RPCServiceClient();
		   Options options = serviceClient.getOptions();
		   //設定2秒超時
		   options.setTimeOutInMilliSeconds(2000L);
		   //指定呼叫WebService的URL
		   EndpointReference targetEPR = new EndpointReference(serviceUrl);
		   options.setTo(targetEPR);
		   
		   //指定介面方法的引數值
		   ModelUser modelUser=new ModelUser();
		   modelUser.setUserName("Jecket");
		   modelUser.setUserPwd("123456");
		   Object[] opAddEntryArgs = new Object[] {modelUser};
		   //指定方法返回值的資料型別的Class物件
		   Class[] classes = new Class[] { ModelUser.class };
		   //指定呼叫的方法及WSDL檔案的名稱空間  QName("targetNamespace","method Name");
		   QName qName = new QName("http://fz.demo.stu","WriteModelUser");
		   //呼叫getVersioin方法並輸出該方法的返回值,
		   //返回物件是一個Object的陣列,拿陣列的第一個值,轉換強轉即可
		   modelUser = (ModelUser) serviceClient.invokeBlocking(qName,opAddEntryArgs, classes)[0];
		 
		   System.out.println("name:"+modelUser.getUserName());
		   System.out.println("password:"+modelUser.getUserPwd());
		  } catch (Exception e) {
		   e.printStackTrace();
		   result = e.getMessage();
		   
		  
		  }
		 
	}
	
	

}


4.6 axis2的webservice服務新增到自己的專案中釋出結合spring+maven

然後就是實踐了

1、maven的pom.xml中關於axis2的配置

<dependency>
			<groupId>org.apache.axis2</groupId>
			<artifactId>axis2-transport-http</artifactId>
			<version>1.7.2</version>
		</dependency>
		<dependency>
			<groupId>org.apache.axis2</groupId>
			<artifactId>axis2-spring</artifactId>
			<version>1.7.2</version>
		</dependency>
		<dependency>
			<groupId>org.apache.axis2</groupId>
			<artifactId>axis2</artifactId>
			<version>1.6.2</version>
		</dependency>
		<dependency>
		    <groupId>org.apache.axis2</groupId>
		    <artifactId>axis2-transport-local</artifactId>
		    <version>1.7.2</version>
		</dependency>
		<dependency>
		    <groupId>org.apache.axis2</groupId>
		    <artifactId>axis2-kernel</artifactId>
		    <version>1.6.2</version>
		</dependency>

2、編寫axis2的對外提供服務的類以及方法(我這裡不寫介面了,熟悉spring的應該知道最好使用介面以及介面的實現)

我的專案名稱是 mavenssh,包路徑為com.bestcxx.mavenstu.mavenssh.axis2,類名為Axis2Webservice,方法只有一個叫getStrA

package com.bestcxx.mavenstu.mavenssh.axis2;

public class Axis2Webservice {
	
	public String getStrA(){
		String str="123";
		System.out.println("你輸入的是:"+str);
		return str;
	}

}
3、spring的applicationContext.xml中將Axis2Webservice註冊為bean
<!--如果沒有ServletContext配置 則需要增加下面這句 -->
	<!--<bean id="applicationContext" 
    class="org.apache.axis2.extensions.spring.receivers.ApplicationContextHolder" /> -->

    <bean id="springAwareService" class="com.bestcxx.mavenstu.mavenssh.axis2.Axis2Webservice" scope="prototype"/>

4、web.xml編寫
<listener>
		<description>Spring ApplicationContext 載入</description>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
<!-- Spring ApplicationContext配置檔案的路徑,可使用萬用字元,多個路徑用,號分隔 此引數用於後面的Spring Context 
		Loader -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:spring/applicationContext.xml</param-value>
	</context-param>

<!-- axis2設定 -->
	 <servlet>  
        <servlet-name>AxisServlet</servlet-name>    
        <servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class>  
    </servlet> 

    <servlet-mapping>
        <servlet-name>AxisServlet</servlet-name>
        <url-pattern>/services/*</url-pattern>
    </servlet-mapping>

5、最後是services.xml的編寫,這裡需要注意路徑

比如這裡我的專案名稱為mavenssh

就需要把services.xml放置到專案的如下路徑中

-webapp

 -WEB-INF

    -services

      -mavenssh

        -META-INF

          -services.xml


services.xml的內容為

<service name="SpringAwareService"><!-- 訪問的時候,這個是wsdl服務的名字 -->
    <description>
        simple spring example
    </description>
    <parameter name="ServiceObjectSupplier">org.apache.axis2.extensions.spring.receivers.SpringServletContextObjectSupplier</parameter>
    <parameter name="SpringBeanName">springAwareService</parameter><!-- 這個是spring中配置的bean名字 -->
    <parameter name="getStrA"><!-- 這個是對外提供的服務的具體方法名 -->
    <messageReceiver class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>
    </parameter>
</service> 
6、這樣之後,服務就已經可以正常啟動和訪問了

http://localhost:8085/mavenssh/services/SpringAwareService?wsdl

7、但是控制檯提示

 Please update your axis2.xml file!

只需把我們上面實驗的axis2.war中的WEB_INF/conf/下的axis2.xml複製到mavenssh(你的專案)下的WEB_INF目錄下即可

裡面有個使用者名稱和密碼,建議註釋掉。