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目錄下即可
裡面有個使用者名稱和密碼,建議註釋掉。