CXF入門教程(2) -- 第一個客戶端
參考:[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]
一旦生成了客戶端,典型的用法如下:
至此,一個簡單的webService客戶端已經完成了。
[color=red][b]JAX-WS代理[/b][/color]
除了使用使用wsdl2java 直接生成客戶端,我們也可以使用 Service.create 來生成服務例項,下面的程式碼展示了這一過程:
文中對應的程式碼已經上傳,與教程(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"));
相關文章
- Spring Cloud入門教程-Ribbon實現客戶端負載均衡SpringCloud客戶端負載
- FTP 客戶端使用教程FTP客戶端
- Spring Boot響應式客戶端WebClient入門Spring Boot客戶端Webclient
- 前端入門6-JavaScript客戶端api&jQuery前端JavaScript客戶端APIjQuery
- Netty入門系列(1) --使用Netty搭建服務端和客戶端Netty服務端客戶端
- websocket(多個客戶端)Web客戶端
- RabbitMQ Go客戶端教程5——topicMQGo客戶端
- Identity Server 4 從入門到落地(八)—— .Net Framework 客戶端IDEServerFramework客戶端
- Identity Server 4 從入門到落地(七)—— 控制檯客戶端IDEServer客戶端
- db2 客戶端安裝DB2客戶端
- InfluxDB 客戶端基礎操作2UX客戶端
- Docker v2ray 客戶端Docker客戶端
- vnc windows客戶端,vnc windows客戶端下載,具體使用教程。VNCWindows客戶端
- SDL3 入門(2):第一個視窗
- Batch入門教程(2)BAT
- 《HBase 不睡覺》第四章 – 客戶端 API 入門客戶端API
- 《HBase 不睡覺》第四章 - 客戶端 API 入門客戶端API
- Redis 入門 - C#|.NET Core客戶端庫六種選擇RedisC#客戶端
- go語言入門教程分享:第一個程式:HelloWorldGo
- Flutter入門教程(四)第一個flutter專案解析Flutter
- windows tftp客戶端,5步掌握win7開啟tftp客戶端的方法教程WindowsFTP客戶端Win7
- Java中OpenAI API客戶端原始碼教程JavaOpenAIAPI客戶端原始碼
- ftp客戶端軟體,ftp客戶端軟體哪個好用,使用方法FTP客戶端
- vnc登入工具,好用的vnc登入工具,具體登入vnc客戶端使用教程VNC客戶端
- uiautomator2 入門教程UI
- 跨平臺SSH客戶端Termius for Mac使用教程客戶端Mac
- 自己動手寫個 Android客戶端Android客戶端
- OrzClick: 國慶寫個 ClickHouse 客戶端客戶端
- DB2 匯入和匯出 命令列和客戶端匯出DB2命令列客戶端
- dubbo客戶端客戶端
- Pulsar客戶端客戶端
- mqtt 客戶端MQQT客戶端
- java TCP入門程式設計(檔案傳送、服務端接收多個客戶端請求)JavaTCP程式設計服務端客戶端
- 服務端,客戶端服務端客戶端
- 客戶端,服務端客戶端服務端
- Identity Server 4 從入門到落地(九)—— 客戶端User和Role的解析IDEServer客戶端
- Nacos - 客戶端心跳續約及客戶端總結客戶端
- 開源Influxdb2高效能客戶端UXDB2客戶端
- 物理DataGuard客戶端無縫切換--客戶端TAF 配置客戶端