1. 程式人生 > >java自帶wsimport命令生成webservice客戶端程式碼及服務呼叫

java自帶wsimport命令生成webservice客戶端程式碼及服務呼叫

wsimport是jdk自帶的命令,可在jdk/bin目錄下找到wsimport.exe,根據wsdl文件生成客戶端中間程式碼,基於生成的程式碼編寫客戶端,可以省很多麻煩。

wsimport命令用法
wsimport [options] WSDL_URI
比較常用的[options]有:
1. -d <directory>
在指定的目錄生成class檔案
2. -clientjar <jarfile>
在當前目錄生成jar檔案,結合-d <directory>可以在指定的目錄生成jar檔案
3. -s <directory>


在指定的目錄生成java原始檔
4. -p <pkg>
指定生成檔案的包結構
5. -keep
在生成class檔案,或者jar包時,同時保留java原始檔

常用組合
1、在指定的目錄生成指定包結構的java原始檔
假設wsdl文件的uri為http://localhost:12345/aservice?wsdl,那麼在E:\temp下,生成包結構為com.nantian.ws的java原始檔的命令為:
wsimport -s E:\temp -p com.nantian.ws http://localhost:12345/aservice?wsdl

2、在指定的目錄生成指定包結構的jar檔案(需要JDK1.8以上版本)
假設wsdl文件的uri為

http://localhost:12345/aservice?wsdl,那麼在E:\temp下,生成包結構為com.nantian.ws的ws.jar的命令為:
wsimport -d E:\temp -clientjar ws.jar -p com.nantian.ws http://localhost:12345/aservice?wsdl

生成客戶端程式碼後放入我們的專案中
這裡寫圖片描述

然後就可以測試呼叫我們的介面了
這裡我們寫一個類Test.java進行測試,
(1)、動態生成客戶端程式碼,不會過度依賴生成的客戶端程式碼(用axis、CXF一類的webservice框架可以不用匯入這麼多客戶端程式碼就能呼叫介面,框架類的後續再更,本篇就介紹jax-ws)

package com.nantian.ws.client;

import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import com.nantian.ws.Aservice;

public class Test {

    public static void main(String[] args) {
        try {  
            //建立訪問wsdl服務地址的url  
            URL url = new URL("http://localhost:12345/aservice?wsdl");  
            //通過QName指明服務的和具體資訊  
            QName sname= new QName("http://ws.nantian.com/","AserviceImplService");  
            //建立服務  
            Service service = Service.create(url,sname);  
            //實現介面  
            Aservice ms =service.getPort(Aservice.class);  

            System.out.println(ms.add(12, 33));  
            System.out.println(ms.getMessageWithParam("11111"));
        } catch (MalformedURLException e) {  
            e.printStackTrace();  
        } 
    }
}

執行結果:

45
Your message is :11111

(2)、完全使用客戶端程式碼呼叫介面

package com.nantian.ws.client;

import com.nantian.ws.Aservice;
import com.nantian.ws.AserviceImplService;

public class Test {

    public static void main(String[] args) {

        AserviceImplService ais = new AserviceImplService();
        Aservice aservice = ais.getAserviceImplPort();
        int sum = aservice.add(1, 2);
        String msg = aservice.getMessage();
        System.out.println("sum is :"+sum);
        System.out.println("msg :"+msg);

    }
}

執行結果:

sum is :3
msg :hello

不同的方式,都能得到想要的結果。