Service大講堂之Axis2(1):用POJO實現0配置的WebService

http://www.blogjava.net/nokiaguy/archive/2009/04/archive/2009/nokiaguy/archive/2009/nokiaguy/archive/2009/01/02/249556.html

 

 

Axis2是一套嶄新的WebService引擎,該版本是對Axis1.x重新設計的產物。Axis2不僅支持SOAP1.1SOAP1.2,還集成了非常流行的REST WebService,同時還支持SpringJSON等技術。這些都將在後面的系列教程中講解。在本文中主要介紹瞭如何使用Axis2開發一個不需要任何配置文件的WebService,並在客戶端使用JavaC#調用這個WebService

一、Axis2的下載和安裝

    讀者可以從如下的網址下載Axis2的最新版本:

    http://ws.apache.org/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

    http://localhost:8080/axis2/

    如果在瀏覽器中顯示出如圖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來分別測試getGreetinggetPrice方法:

http://localhost:8080/axis2/services/SimpleService/getGreeting?name=bill

http://localhost:8080/axis2/services/SimpleService/getPrice 

    3和圖4分別顯示了getGreetinggetPrice方法的測試結果。

 

圖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. 發佈WebServicepojo目錄只是默認的,如果讀者想在其他的目錄發佈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. 客戶端代碼需要引用很多Axis2jar包,如果讀者不太清楚要引用哪個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#代碼就可以調用getGreetinggetPrice方法,並顯示這兩個方法的返回值:

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 銀河使者

setName方法未定義錯誤。  回覆  更多評論   

# 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 銀河使者

SimpleService 沒找到  回覆  更多評論   

# 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章