CXF入門教程(2) -- 第一個客戶端

不淨之心發表於2013-04-06
參考:[url]http://blog.csdn.net/neareast/article/details/7717568[/url]
文中對應的程式碼已經上傳,與教程(1)中的service相對應。為除錯方便,將service和client都放在了同一個工程中,不過是在不同的包中;本文對應的兩個基本客戶端在com.neareast.test.cxf.client.consumer包中,服務端ServiceTest類在com.neareast.test.cxf.server.service包中。程式碼地址如下:
http://download.csdn.net/detail/neareast/4411870
最常見的情境是,我們有一個服務的WSDL;無論這個服務是不是我們自己維護的,我們都可以從這個WSDL檔案來生成客戶端,包括一個強型別的介面,並通過介面來與服務進行互動。


使用WSDL2Java工具,可以通過WSDL生成JAX-WS客戶端。使用WSDL2java有以下三種方法:
[color=red]The command line 命令列
The Maven Plugin Maven外掛
使用WSDL2Java API[/color]
要深入獲取更多資訊,可以參閱 Developing a JAX-WS consumer 一文或髮型包中的示例程式。

Eclipse和Maven的外掛最終應該還是呼叫WSDL2Java命令來實現的。這裡我們使用上一篇中釋出的服務,直接在控制檯使用 wsdl2java http://localhost:9000/helloWorld?wsdl 命令,即可在命令所在目錄下( 如筆者在 apache-cxf-2.6.1包的bin目錄下呼叫wsdl2java 命令,生成的類檔案就在這個目錄下),生成與WSDL中的targetNamespace相對應的包路徑,將相應的類放到該目錄下,客戶端直接呼叫這些類即可;比較無奈的是,生成的程式碼居然是ANSI格式的……

然而,生成的HelloWorld類報錯,如HelloWorld方法的super(WSDL_LOCATION, SERVICE, features);這行報錯,原因是javax.xml.ws.Service中缺少Service(URL, QName, WebServiceFeature[]) 構造方法。我們引入的geronimo-jaxws_2.2_spec-1.1.jar包裡,提供了新版本的Service類,但是需要進行endorse才能夠替換掉jre自帶的Service類。為儘量較少以後移植的麻煩,我們可以根據註釋中的提示指定-frontend引數,使用JAX-WS 2.1相容模式重新生成所有的類,順便用-p引數指定我們需要的名稱空間:
[b]生成客戶端檔案1:[/b]
[color=red]wsdl2java -p com.neareast.test.cxf.client.WSDL2Java -frontend jaxws21
http://localhost:9000/helloWorld?wsdl[/color]
[b]生成客戶端檔案2:[/b]
[color=red]wsdl2java -d /mnt/d/vmware_shared_folder/workspace/webserviceclient/src/main/java -p com.websercices.client -frontend jaxws21 http://localhost:8080/webservice/HelloWorld?wsdl[/color]
-d引數:指定檔案存放位置.
[b]一些引數說明:[/b]
[color=red]wsdl2java -ant -client -d D:/temp -p com.neareast.test.cxf.client.WSDL2Java -frontend jaxws21 hello_world.wsdl [/color]
-ant 指定要生成一個ant的構建說明文件build.xml。
-client 指定要生成一個測試客戶端的“起點程式碼”(starting point code),其中包含了埠中所有方法的測試樣例程式碼。
-d 指定我們想要把生成的檔案放到哪個目錄下,預設是wsdl2Java命令所在的目錄。
-p 指定生成檔案的包名;預設是根據WSDL檔案中的名稱空間相對應。
-frontend 指定前端型別及版本;目前僅支援 JAXWS 前端,用 "jaxws21" 表明要生成JAX-WS 2.1 相容的程式碼(Jre6自帶的就是這個版本),使用該引數的原因請參考教程(2)。

生成的類如下圖所示;其中HelloWorld類用來啟動對服務的監聽,IHelloWorld類就是呼叫服務的介面。
[img]https://img-my.csdn.net/uploads/201207/05/1341459741_1305.jpg[/img]


一旦生成了客戶端,典型的用法如下:
public class BasicClient {  
public static void main(String[] args){
HelloWorld server = new HelloWorld();
IHelloWorld hello = server.getHelloWorldImplPort();

String result = hello.sayHi("East");
System.out.println(result);

User user = new User();
user.setName("East");
System.out.println(hello.sayHiToUser(user));

System.out.println("All the users are: ");
for(IdentifiedUser u:hello.getUsers().getEntry()){
System.out.println( u.getUser().getName() );
}
}
}



至此,一個簡單的webService客戶端已經完成了。

[color=red][b]JAX-WS代理[/b][/color]
除了使用使用wsdl2java 直接生成客戶端,我們也可以使用 Service.create 來生成服務例項,下面的程式碼展示了這一過程:
URL url = null;  
try {
url = new URL("http://localhost:9000/helloWorld?wsdl");
} catch (MalformedURLException e) {
java.util.logging.Logger.getLogger(HelloWorld.class.getName())
.log(java.util.logging.Level.INFO,
"Can not initialize the default wsdl from {0}", "http://localhost:9000/helloWorld?wsdl");
}
WSDL_LOCATION = url;


Service service = Service.create(WSDL_LOCATION, SERVICE_NAME);    
IHelloWorld hw = service.getPort(IHelloWorld.class);
System.out.println(hw.sayHi("World"));

相關文章