Axis2是一套嶄新的WebService引擎,該版本是對Axis1.x重新設計的產物。Axis2不僅支持SOAP1.1和SOAP1.2,還集成了非常流行的REST WebService,同時還支持Spring、JSON等技術。這些都將在後面的系列教程中講解。在本文中主要介紹瞭如何使用Axis2開發一個不需要任何配置文件的WebService,並在客戶端使用Java和C#調用這個WebService。
一、Axis2的下載和安裝
讀者可以從如下的網址下載Axis2的最新版本:
在本文使用了目前Axis2的最新版本1.4.1。讀者可以下載如下兩個zip包:
axis2-1.4.1-bin.zip
axis2-1.4.1-war.zip
其中axis2-1.4.1-bin.zip文件中包含了Axis2中所有的jar文件, axis2-1.4.1-war.zip文件用於將WebService發佈到Web容器中。
將axis2-1.4.1-war.zip文件解壓到相應的目錄,將目錄中的axis2.war文件放到<Tomcat安裝目錄>/webapps目錄中(本文使用的Tomcat的版本是6.x),並啓動Tomcat。
在瀏覽器地址欄中輸入如下的URL:
如果在瀏覽器中顯示出如圖1所示的頁面,則表示Axis2安裝成功。
圖1
二、編寫和發佈WebService
對於用Java實現的服務程序給人的印象就是需要進行大量的配置,不過這一點在Axis2中將被終結。在Axis2中不需要進行任何的配置,就可以直接將一個簡單的POJO發佈成WebService。其中POJO中所有的public方法將被髮布成WebService方法。
下面我們來實現一個簡單的POJO,代碼如下:
public class SimpleService
{
public String getGreeting(String name)
{
return "你好 " + name;
}
public int getPrice()
{
return new java.util.Random().nextInt(1000);
}
}
在SimpleService類中有兩個方法,由於這兩個方法都是public方法,因此,它們都將作爲WebService方法被髮布。
編譯SimpleService類後,將SimpleService.class文件放到<Tomcat安裝目錄>/webapps/axis2/WEB-INF/pojo目錄中(如果沒有pojo目錄,則建立該目錄)。現在我們已經成功將SimpleService類發佈成了WebService。在瀏覽器地址欄中輸入如下的URL:
http://localhost:8080/axis2/services/listServices
這時當前頁面將顯示所有在Axis2中發佈的WebService,如圖2所示。
在瀏覽器地址欄中輸入如下的兩個URL來分別測試getGreeting和getPrice方法:
http://localhost:8080/axis2/services/SimpleService/getGreeting?name=bill
http://localhost:8080/axis2/services/SimpleService/getPrice
圖3和圖4分別顯示了getGreeting和getPrice方法的測試結果。
圖3 getGreeting方法的測試結果
圖4 getPrice方法的測試結果
在編寫、發佈和測試0配置的WebService時應注意如下幾點:
1. POJO類不能使用package關鍵字聲明包。
2. Axis2在默認情況下可以熱發佈WebService,也就是說,將WebService的.class文件複製到pojo目錄中時,Tomcat不需要重新啓動就可以自動發佈WebService。如果想取消Axis2的熱發佈功能,可以打開<Tomcat安裝目錄>/webapps/axis2/WEB-INF/conf/axis2.xml,找到如下的配置代碼:
<parameter name="hotdeployment">true</parameter>
將true改爲false即可。要注意的是,Axis2在默認情況下雖然是熱發佈,但並不是熱更新,也就是說,一旦成功發佈了WebService,再想更新該WebService,就必須重啓Tomcat。這對於開發人員調試WebService非常不方便,因此,在開發WebService時,可以將Axis2設爲熱更新。在axis2.xml文件中找到<parameter name="hotupdate">false</parameter>,將false改爲true即可。
3. 在瀏覽器中測試WebService時,如果WebService方法有參數,需要使用URL的請求參數來指定該WebService方法參數的值,請求參數名與方法參數名要一致,例如,要測試getGreeting方法,請求參數名應爲name,如上面的URL所示。
4. 發佈WebService的pojo目錄只是默認的,如果讀者想在其他的目錄發佈WebService,可以打開axis2.xml文件,並在<axisconfig>元素中添加如下的子元素:
<deployer extension=".class" directory="my" class="org.apache.axis2.deployment.POJODeployer"/>
上面的配置允許在<Tomcat安裝目錄>/webapps/axis2/WEB-INF/my目錄中發佈WebService。例如,將本例中的SimpleService.class複製到my目錄中也可以成功發佈(但要刪除pojo目錄中的SimpleService.class,否則WebService會重名)。
三、 用Java實現調用WebService的客戶端程序
WebService是爲程序服務的,只在瀏覽器中訪問WebService是沒有意義的。因此,在本節使用Java實現了一個控制檯程序來調用上一節發佈的WebService。調用WebService的客戶端代碼如下:
package client;
import javax.xml.namespace.QName;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
public class RPCClient
{
public static void main(String[] args) throws Exception
{
// 使用RPC方式調用WebService
RPCServiceClient serviceClient = new RPCServiceClient();
Options options = serviceClient.getOptions();
// 指定調用WebService的URL
EndpointReference targetEPR = new EndpointReference(
"http://localhost:8080/axis2/services/SimpleService");
options.setTo(targetEPR);
// 指定getGreeting方法的參數值
Object[] opAddEntryArgs = new Object[] {"超人"};
// 指定getGreeting方法返回值的數據類型的Class對象
Class[] classes = new Class[] {String.class};
// 指定要調用的getGreeting方法及WSDL文件的命名空間
QName opAddEntry = new QName("http://ws.apache.org/axis2", "getGreeting");
// 調用getGreeting方法並輸出該方法的返回值
System.out.println(serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, classes)[0]);
// 下面是調用getPrice方法的代碼,這些代碼與調用getGreeting方法的代碼類似
classes = new Class[] {int.class};
opAddEntry = new QName("http://ws.apache.org/axis2", "getPrice");
System.out.println(serviceClient.invokeBlocking(opAddEntry, new Object[]{}, classes)[0]);
}
}
運行上面的程序後,將在控制檯輸出如下的信息:
你好 超人
443
在編寫客戶端代碼時應注意如下幾點:
1. 客戶端代碼需要引用很多Axis2的jar包,如果讀者不太清楚要引用哪個jar包,可以在Eclipse的工程中引用Axis2發行包的lib目錄中的所有jar包。
2. 在本例中使用了RPCServiceClient類的invokeBlocking方法調用了WebService中的方法。invokeBlocking方法有三個參數,其中第一個參數的類型是QName對象,表示要調用的方法名;第二個參數表示要調用的WebService方法的參數值,參數類型爲Object[];第三個參數表示WebService方法的返回值類型的Class對象,參數類型爲Class[]。當方法沒有參數時,invokeBlocking方法的第二個參數值不能是null,而要使用new Object[]{}。
3. 如果被調用的WebService方法沒有返回值,應使用RPCServiceClient類的invokeRobust方法,該方法只有兩個參數,它們的含義與invokeBlocking方法的前兩個參數的含義相同。
4. 在創建QName對象時,QName類的構造方法的第一個參數表示WSDL文件的命名空間名,也就是<wsdl:definitions>元素的targetNamespace屬性值,下面是SimpleService類生成的WSDL文件的代碼片段:
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:ns1="http://org.apache.axis2/xsd"
xmlns:ns="http://ws.apache.org/axis2" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl"
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
targetNamespace="http://ws.apache.org/axis2">
<wsdl:types>
</wsdl:types>
</wsdl:definitions>
四、用wsdl2java簡化客戶端的編寫
也許有很多讀者會說“有沒有搞錯啊,只調用兩個WebService方法用要寫這麼多代碼,太麻煩了”。
不過幸好Axis2提供了一個wsdl2java.bat命令可以根據WSDL文件自動產生調用WebService的代碼。wsdl2java.bat命令可以在<Axis2安裝目錄>"bin目錄中找到。在使用wsdl2java.bat命令之前需要設置AXIS2_HOME環境變量,該變量值是<Axis2安裝目錄>。
在Windows控制檯輸出如下的命令行來生成調用WebService的代碼:
%AXIS2_HOME%/bin/wsdl2java -uri http://localhost:8080/axis2/services/SimpleService?wsdl -p client -s -o stub
其中-url參數指定了wsdl文件的路徑,可以是本地路徑,也可以是網絡路徑。-p參數指定了生成的Java類的包名,-o參數指定了生成的一系列文件保存的根目錄。在執行完上面的命令後,讀者就會發現在當前目錄下多了個stub目錄,在."stub"src"client目錄可以找到一個SimpleServiceStub.java文件,該文件複雜調用WebService,讀者可以在程序中直接使用這個類,代碼如下:
package client;
import javax.xml.namespace.QName;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
public class StubClient
{
public static void main(String[] args) throws Exception
{
SimpleServiceStub stub = new SimpleServiceStub();
SimpleServiceStub.GetGreeting gg = new SimpleServiceStub.GetGreeting();
gg.setName("比爾");
System.out.println( stub.getGreeting(gg).get_return());
System.out.println(stub.getPrice().get_return());
}
}
上面的代碼大大簡化了調用WebService的步驟,並使代碼更加簡潔。但要注意的是,wsdl2java.bat命令生成的Stub類將WebService方法的參數都封裝在了相應的類中,類名爲方法名,例如,getGreeting方法的參數都封裝在了GetGreeting類中,要想調用getGreeting方法,必須先創建GetGreeting類的對象實例。
五、使用C#調用WebService
從理論上說,WebService可以被任何支持SOAP協議的語言調用。在Visual Studio中使用C#調用WebService是在所有語言中最容易實現的(VB.net的調用方法類似,也同樣很簡單)。
新建一個Visual Studio工程,並在引用Web服務的對話框中輸入如下的URL,並輸入Web引用名爲“WebService”:
http://localhost:8080/axis2/services/SimpleService?wsdl
然後引用Web服務的對話框就會顯示該WebService中的所有的方法,如圖5所示。
在完成上面的工作後,只需要如下三行C#代碼就可以調用getGreeting和getPrice方法,並顯示這兩個方法的返回值:
WebService.SimpleService simpleService = new WSC.WebService.SimpleService();
MessageBox.Show( simpleService.getGreeting("比爾"));
MessageBox.Show(simpleService.getPrice()[email protected]());
在.net解析WSDL文件時直接將getGreeting方法的參數映射爲String類型,因此,可以直接進行傳值。
從上面的調用過程可以看出,添加Web引用的過程就相當於在Java中調用wsdl2java.bat自動生成stub類的過程。只是在調用stub類時與C#有一定的區別,但從總體上來說,都大大簡化了調用WebService的過程。
下一篇:WebService大講堂之Axis2(2):複合類型數據的傳遞
國內最棒的Google Android技術社區(eoeandroid),歡迎訪問!
《銀河系列原創教程》發佈
《Java Web開發速學寶典》出版,歡迎定購
posted on 2009-01-02 17:17 銀河使者 閱讀(12786) 評論(80) 編輯 收藏 所屬分類: java 、 原創 、webservice
評論
# re: WebService大講堂之Axis2:用POJO實現0配置的WebService 2009-01-02 22:58 zuzong
太棒了~~~~我正好需要啊,太及時了~~~~ 回覆 更多評論
# re: WebService大講堂之Axis2:用POJO實現0配置的WebService 2009-01-03 10:40 聊聊
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService[未登錄] 2009-01-04 09:35 haha
太棒了......我也正好趕上.....太及時了......
每天都關注blogjava的博文。受益匪淺。 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-01-04 17:14 zuzong
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-01-06 14:43 hou
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-01-07 10:59 火線生存
# Pojo類如何使用import調用其他類文件 2009-01-19 04:30 加加
看了博主的文章,受益非淺。。。
但是本人在博主文章的基礎之上作進一步的學習的時候遇到了困難。
如題
Pojo類如何使用import調用其他類文件
本人發現使用 import引進其他包的時候,
調用方法,之後就會出現下面的XML說明
<soapenv:Reason>
<soapenv:Text xml:lang="en-US">unknown</soapenv:Text>
</soapenv:Reason>
望博主在Pojo類中,如何調用其他文件作下說明 謝謝 回覆 更多評論
# Pojo類如何使用import調用其他類文件 2009-01-19 05:30 加加
我主要是想要調用
axis2文件目錄以外的文件。。。
就像 我本來有一個JAVA程序,我想把它發佈爲WebService
可是不想把它整個程序都放到axis2文檔目錄下
只想用它的其中幾個公共類打包發佈成WebService。。
所以在這裏就遇到困難了 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-01-19 08:37 銀河使者
@加加
是這樣的,axis2實際上就是一個Web目錄,在該目錄中可以發佈jsp、servlet,而webservice是依賴servlet來實現的,因此,也可以發佈web service,當然,可以將axis2改成其他的名子,如ws。如果想發佈類,一般有兩種方法:
1. 按着本文所述,直接放在pojo目錄或其他的發佈目錄中。
2. 將這些類放在axis2/WEB-INF/classes目錄中,然後使用service.xml文件進行發佈。這塊在後面的文章將詳細講解
在axis2目錄有一些jar文件還需要帶的,否則使用axis2無法成功發佈web service,當然,axis2目錄中的jar文件並不是都需要,根據使用的功能需要不同的jar文件,不過爲了簡單,可以將所有的jar包都保留。不過這是在服務端,應該沒什麼關係。 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-01-19 08:39 銀河使者
在本系列的後續文章還會講到使用service.xml文件來發布webservice,這種方式比較好,除此之外,還會講到會話在web service中的應用,以及如何跨服務共享會話(session),在c#、delphi中使用調用複雜的web service等。 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService[未登錄] 2009-02-05 10:38 ziyoo
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-02-16 16:48 遊客ABC
謝謝博主共享了這麼有實用的東西,正在學習中... 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-02-22 10:37 Christino
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-02-23 14:16 zhuyongjp
問下,一個完整項目中只發布部分功能成服務,把這幾個類放到axis2文檔目錄下吧?但這些類如何調用項目中其他類啊???
回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-02-23 14:46 銀河使者
@zhuyongjp
被調用的類需要放在axis2目錄中的WEB-INF/lib目錄或WEB-INF/classes目錄中,這樣就可以調用了 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-02-23 16:34 zhuyongjp
謝謝,在請教下。如果項目中有些方法既要在內部調用,又要提供對外服務,那這些類應該如何放置呢? 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-02-23 16:46 銀河使者
這些類應該放在WEB-INF/lib目錄或WEB-INF/classes目錄中,如果要在內部使用,直接調用就可以了,如果在外部使用(如發佈成WebService),建議你使用spring來處理,這樣只要在aar文件中放一個services.xml就可以了,直接可以將spring的裝配bean發佈成webservice。
你可以參考我的文章:
http://www.blogjava.net/nokiaguy/archive/2009/nokiaguy/archive/2009/02/13/254499.html 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-03-16 16:48 Christino
博主!如果我所發佈webservice類前面引用其它的第三方jar包,那這些jar包應該如何引用進來?我是把那些jar包直接放到WEB-INF/lib目錄裏了,沒有提示出錯什麼的,但生成的wsdl文件中都是element maxOccurs="unbounded“的語句,很多。不知道是怎麼回事!望解決~ 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-03-16 17:11 銀河使者
@Christino
用java或其他客戶端可以生成stub類並調用嗎? 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-03-17 16:09 Christino
我不清楚您說的是什麼意思?
我要發佈的Webservice方法前引用了第三方的jar包。說的詳細些就是:我要把matlab的算法(方法)做成webservice來發布,但是其中要引用matlab一些相關的jar包.現在不清楚怎麼才能成功的調用?請指教一下,謝謝! 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-03-17 16:49 銀河使者
@Christino
將第三方的包放在axis2/WEB-INF/lib目錄中,然後在webservice類中引用並調用相關的類就可以了,在客戶端調用沒什麼區別。有什麼問題嗎?如果是正式發佈的webservice,建議看看我後面的幾篇文章,建議使用services.xml文件來發布,而不要放在pojo裏,這裏面的類不能有package。
回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-03-17 16:49 Christino
再請教一個問題我所傳遞的參數有的是17520*10的二維數組,像您第二篇寫的那樣,這樣的參數就肯定不能傳遞嗎?謝謝! 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-03-17 17:00 銀河使者
多維數組axis2不支持,但可以使用對象數組,如聲明一個長度爲17520的數組,數組元素類型是一個對象,這個對象有一個類型爲數組(長度爲10)的屬性。然後傳到服務器再轉換一下就可以了。 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-03-17 19:00 Christino
呵呵,對,我就是用services.xml來發布的。非常,非常感謝您!我試試! 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-03-18 10:28 Christino
按照您的方法,我試了一下。我做了一個ArrayTemp類來承載這個二維數組,正如我上面所說,我要這個二維數組當做參數傳遞到webservice類的方法,如public Object[] getWebFigure(String[] _nee, ArrayTemp[] arr)這種形式。但是在客戶端傳遞進去的時候,報錯說ArrayTemp類型不匹配。如:getWebFigure.setArr(arr);,,,,所以是不是axis2中參數的數據類型只能是基本類型,像這種對象參數他不認是不是?謝謝! 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-03-18 12:22 銀河使者
@Christino
按你的getWebFigure方法沒有錯誤,我做了一個例子,完全沒問題,可能是你設置的問題,另外要注意,ArrayTemp的相應屬性必須有getter和setter方法,Axis2不會直接訪問public的類字段,而是通過getter和setter方法來獲得和設置屬性值的。例子代碼如下:
package service;
public class ArrayTemp
{
public int[] values = new int[10];
public int[] getValues()
{
return values;
}
public void setValues(int[] values)
{
this.values = values;
}
}
// webservice類
package service;
public class ComplexTypeService
{
public ArrayTemp[] getWebFigure(String[] _nee, ArrayTemp[] arr)
{
System.out.println(_nee[0]);
System.out.println(arr[0].values[0]);
ArrayTemp t = new ArrayTemp();
return new ArrayTemp[]{t};
}
}
<!-- services.xml -->
<service name="ComplexTypeService" >
<Description>
Please Type your service description here
</Description>
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2006/01/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
</messageReceivers>
<parameter name="ServiceClass" locked="false">service.ComplexTypeService</parameter>
</service>
我用.net測試的,沒問題,估計Java也不會有問題。
回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-03-18 14:57 Christino
但是我在客戶端傳arr對像數組時,說類型不匹配。getWebFigure.setArr(arr);->出錯。說setArr中的參數應該是SpikeWebserviceStubArrayTemp[]類型,我的arr是ArrayTemp類型。其中SpikeWebserviceStub是用wsdl2java生成的Stub。按您後邊講的,我把ArrayTemp類放到了tomcat6.0/webapps/axis2/WEB-INF/classes/service/ArrayTemp.class中。是這個地方錯了嗎。 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-03-18 15:48 銀河使者
@Christino
還要注意一點,arr的類型不能是ArrayTemp[],必須爲Stub類所帶的相應類型,也就是SpikeWebserviceStub.ArrayTemp[],所以會出現不匹配。
SpikeWebserviceStub.ArrayTemp[] arr = new SpikeWebserviceStub.ArrayTemp[]{...};
getWebFigure.setArr(arr);
這才正確! 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-03-18 16:03 Christino
明白!真的很感謝您花這麼多寶貴的時間來指點我這個菜鳥,由衷的感謝! 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-03-18 16:07 Christino
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-03-18 18:44 銀河使者
@Christino
哈哈,受寵若驚啊!
這也正體現了互聯網的精神:人人爲我,我爲人人!! 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-03-19 15:17 Christino
您的方法是直接把.aar文件放到services文件夾裏,從而生成.wsdl文件。那我怎麼才能修改.wsdl文件啊? 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-03-19 15:27 銀河使者
@Christino
修改wsdl文件?一種方法是在服務端先生成一個wsdl文件,然後放到META-INF目錄中,或直接通過url由客戶端根據wsdl生成Stub類,wsdl只用於客戶端生成Stub類,是靜態的或動態的都可以。當修改webservice類時,wsdl會自動改變的(動態方式)。 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-03-19 15:28 銀河使者
建議還是使用動態生成wsdl的方式,靜態的我也沒用過,不太喜歡靜態的方式 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-04-09 11:07 success2008
你好,我照您的例子做了,0配置什麼都對,但結果如下,出現了空值!不知什麼原因?getPrice方法正確!!<ns:getGreetingResponse xmlns:ns="http://ws.apache.org/axis2">
<return>hellonull</return>
</ns:getGreetingResponse> 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-04-09 11:43 銀河使者
@success2008
你這程序用什麼測的,是直接在瀏覽器中測試的,還是使用本文的客戶端程序? 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService[未登錄] 2009-04-11 23:33 ajax
我遇到了同樣的問題.
在瀏覽器中測試
無論傳入什麼參數總是 出現
- <ns:getGreetingResponse xmlns:ns="http://ws.apache.org/axis2">
<return>你好 null</return>
</ns:getGreetingResponse> 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-04-13 08:31 銀河使者
@ajax
你在瀏覽器中輸入的url是什麼,發上來看看 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-04-13 14:52 gp0014
我也是,原因是wsdl自動生成後,參數是<xs:element minOccurs="0" name="param0" nillable="true" type="xs:string"/>
名字變成了param0,所以要變成http://localhost:8080/axis2/services/SimpleService/getGreeting?param0=bill,不知道在生成wsdl時指定參數名字 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-04-13 15:22 銀河使者
@gp0014
是這個問題,所有我問一下訪問的url,哈哈。如果用services.xml進行配置,名子是不會變的。 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService[未登錄] 2009-04-14 22:25 ajax
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService[未登錄] 2009-04-28 18:04Spring
@銀河使者
怎麼修改wsdl中的參數,比如你在SimpleService中的name在wsdl中式param0,怎麼把它改過來 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-04-28 19:43 銀河使者
這個改不了,但使用services.xml文件來發布webservice,就是name了。試試看 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-05-08 19:32 心夢帆影
gg.setName("比爾");
這個地方,在我的環境裏測試,是沒有setName方法的,
我改成gg.setParam0("比爾");行了. 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-05-13 23:02 minmin
受益匪淺,希望博主及時更新,給大家提供更多的學習資源 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-05-16 19:05 bginner121
The import org.apache.axis2.rpc.client.RPCServiceClient cannot be resolved
怎麼解決?
QQ 418329288 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-05-16 19:31 銀河使者
那個庫沒引用。你可以引用axis2中的所有的jar文件試試 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-05-16 23:10 bginner121
@銀河使者
是的,我想知道具體要引用哪個包? 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-05-16 23:15 bginner121
@bginner121
The import org.apache.axis2.rpc.client.RPCServiceClient cannot be resolved ,怎麼解決?
需要引用 axis2-adb-1.3.jar 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-05-17 00:57 bginner121
如何解決?
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The method setName(String) is undefined for the type SimpleServiceStub.GetGreeting
at org.bgnnr.client.StubClient.main(StubClient.java:15) 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-05-17 09:20 銀河使者
你的程序有語法錯誤,你是手工編譯的嗎?還是用eclipse? 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-05-17 18:23 java web
你好,我照您的例子做了,不知什麼原因?
<ns:getGreetingResponse xmlns:ns="http://ws.apache.org/axis2">
<return>hello null</return>
</ns:getGreetingResponse>
總是空直。。。鬱悶啊! 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-05-17 19:55 銀河使者
用http://localhost:8080/axis2/services/SimpleService/getGreeting?param0=bill
試試 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-05-19 18:39 java web
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-05-21 12:41 beginner121
如何解決?
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The method setName(String) is undefined for the type SimpleServiceStub.GetGreeting
at org.bgnnr.client.StubClient.main(StubClient.java:15)
回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-05-21 13:15 銀河使者
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-08-13 15:17 amado
# 關於Faulty Services 2009-08-14 19:59 亦澤
您好,在按您的步驟進行操作之後,我發佈的服務卻無法顯示,是Faulty Services。點擊之後提示說This Web axisService has deployment faults,錯誤爲Error: java.lang.UnsupportedClassVersionError: Bad version number in . 請問您該怎麼解決? 謝謝 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-08-18 18:30 tingyun
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-08-19 10:42 銀河使者
這個問題是jdk的版本不對,你們的機器上是否安裝了不同版本的jdk,需要使用同一個版本的jdk編譯程序纔可以。 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService[未登錄] 2009-08-25 10:44 大鵬
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService[未登錄] 2009-09-08 21:32 小菜
問個很菜的問題.wsdl文件是怎麼生成的???這裏面沒有介紹.生成的stub文件夾應該放在那個文件夾下面.項目中的SRC下??? 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-09-08 21:48 銀河使者
wsdl文件是通過訪問url自動生成的。stub文件夾裏的類放哪都行,只是普通的java類,不過別忘了改package 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-09-08 21:48 銀河使者
可以放在eclipse中的src目錄下就可以 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-09-13 09:20 jackyrong
想問下,我的POJO編譯後的文件,放POJO目錄下,怎麼AXIS2沒發現該服務的?我的也是AXIS2 1.4.1 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-10-07 16:58 smaxpp
爲什麼我使用POJO發佈一個不帶包名的類,但是AXIS2報錯:
Error: org.apache.axis2.deployment.DeploymentException: Invalid service. META-INF directory not found. at org.apache.axis2.deployment.repository.util.ArchiveReader.processWSDLs(ArchiveReader.java:297) at org.apache.axis2.deployment.ServiceDeployer.deploy(ServiceDeployer.java:67)
at org.apache.axis2.deployment.repository.util.DeploymentFileData.deploy(DeploymentFileData.java:136) at org.apache.axis2.deployment.DeploymentEngine.doDeploy(DeploymentEngine.java:597) at org.apache.axis2.deployment.repository.util.WSInfoList.update(WSInfoList.java:144)
at org.apache.axis2.deployment.RepositoryListener.update(RepositoryListener.java:330) at org.apache.axis2.deployment.RepositoryListener.checkServices(RepositoryListener.java:227) at org.apache.axis2.deployment.RepositoryListener.startListener(RepositoryListener.java:324)
at org.apache.axis2.deployment.scheduler.SchedulerTask.checkRepository(SchedulerTask.java:64) at org.apache.axis2.deployment.scheduler.SchedulerTask.run(SchedulerTask.java:71) at org.apache.axis2.deployment.scheduler.Scheduler$SchedulerTimerTask.run(Scheduler.java:83)
at java.util.TimerThread.mainLoop(Unknown Source) at java.util.TimerThread.run(Unknown Source) Caused by: org.apache.axis2.deployment.DeploymentException: Invalid service. META-INF directory not found. at org.apache.axis2.deployment.repository.util.ArchiveReader.processWSDLs(ArchiveReader.java:285)
... 12 more 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-10-07 18:09 銀河使者
沒有META-INF目錄,把pojo放哪個目錄裏了? 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-10-07 20:20 smaxpp
放在C:/Program Files/Apache Software Foundation/Tomcat 6.0/webapps/axis2/WEB-INF/services/pojo
下了
回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-10-19 16:17 天空在線
%AXIS2_HOME%/bin/wsdl2java -uri http://localhost:8080/axis2/services/SimpleService?wsdl -p client -s -o stub
這句話執行不了.報window 找不到%java_home%/bin
回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-10-31 17:38 Mr.Blue
@smaxpp
發佈簡單POJO目錄寫錯了吧,應該是在C:/Program Files/Apache Software Foundation/Tomcat 6.0/webapps/axis2/WEB-INF下面新建一個pojo目錄,然後在將你要發佈的pojo類文件放到裏面。如果你要發佈到services目錄下面,應該是發佈哪種達成aar包形式的Web Service。 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-10-31 17:44 Mr.Blue
@天空在線
提示找不到%JAVA_HOME%/bin/java.exe這個的話你可以看看wsdl2java這個批處理的源碼,裏面對報各種錯誤都有比較詳細的說明,你可以參照着一個個去解決各種異常。 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService[未登錄] 2009-11-07 04:57 學習者
您好,請問我按照您的方法將一個POJO發佈成WebService,卻出現了下面的錯誤,請問這是爲什麼?
This Web axisService has deployment faults
Error: java.lang.NoClassDefFoundError: SimpleService (wrong name: po/SimpleService) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(Unknown Source) at java.security.SecureClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.defineClass(Unknown
Source) at java.net.URLClassLoader.access$000(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown
Source) at java.lang.ClassLoader.loadClass(Unknown Source) at org.codehaus.jam.internal.reflect.ReflectClassBuilder.build(ReflectClassBuilder.java:69) at org.codehaus.jam.provider.CompositeJamClassBuilder.build(CompositeJamClassBuilder.java:51) at org.codehaus.jam.internal.JamClassLoaderImpl.loadClass(JamClassLoaderImpl.java:128)
at org.codehaus.jam.JamClassIterator.nextClass(JamClassIterator.java:68) at org.codehaus.jam.JamClassIterator.next(JamClassIterator.java:88) at org.apache.axis2.deployment.POJODeployer.deploy(POJODeployer.java:95) at org.apache.axis2.deployment.repository.util.DeploymentFileData.deploy(DeploymentFileData.java:136)
at org.apache.axis2.deployment.DeploymentEngine.doDeploy(DeploymentEngine.java:597) at org.apache.axis2.deployment.repository.util.WSInfoList.update(WSInfoList.java:144) at org.apache.axis2.deployment.RepositoryListener.update(RepositoryListener.java:330)
at org.apache.axis2.deployment.RepositoryListener.checkServices(RepositoryListener.java:227) at org.apache.axis2.deployment.RepositoryListener.startListener(RepositoryListener.java:324) at org.apache.axis2.deployment.scheduler.SchedulerTask.checkRepository(SchedulerTask.java:64)
at org.apache.axis2.deployment.scheduler.SchedulerTask.run(SchedulerTask.java:71) at org.apache.axis2.deployment.scheduler.Scheduler$SchedulerTimerTask.run(Scheduler.java:83) at java.util.TimerThread.mainLoop(Unknown Source) at java.util.TimerThread.run(Unknown
Source) 回覆 更多評論
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-11-07 10:15 銀河使者
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService[未登錄] 2009-11-09 23:56 學習者
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService 2009-11-19 10:34 homezly
# re: WebService大講堂之Axis2(1):用POJO實現0配置的WebService[未登錄] 2009-11-22 23:01 學習者
我也出現 類This Web axisService has deployment faults
Error: java.lang.NoClassDefFoundError: SimpleService (wrong name: pojo/SimpleService) at
的錯誤,可我明明按要求放的,怎麼就找不到呢
用的JDK1.4.2 tomcat4 axis2 1.4.1
出現以下
Available services
Version
Service EPR : http://localhost:8080/axis2/services/Version
Service Description : Version
Service Status : Active
Available Operations
getVersion
--------------------------------------------------------------------------------
Faulty Services
E:/jakarta-tomcat-4.1.31/webapps/axis2/WEB-INF/pojo/sayHello.class
# re: WebService大講堂之Axis2:用POJO實現0配置WebService 2009-01-02 17:37 heyang
圖5
圖2