前面分析了一下關於ws的基本知識,我們知道,wsdl是ws中很重要的文檔,我們可以通過解析該wsdl文檔獲取ws的相關信息,其實,如果不瞭解該文檔結構的話,問題也不大,只要會解析即可進行開發。但是如果想要生成一個符合自己項目的,或者比較人性化的一個wsdl的話,或者從可讀性角度來說,就需要在編寫ws代碼時進行一些相應的配置了,比如說ws名稱,參數等等,那麼就需要對wsdl文檔有一定的瞭解。這篇文章主要從兩個角度來展開:一是解釋一下wsdl中的相關配置,二是如何在ws程序中通過註解指定這些配置。
1. wsdl配置詳解
要生成wsdl,首先得有一個ws,我們還是使用前面文章中提到的那個簡單的ws,如下:
@WebService //默認靜態方法是不能發不成ws服務的
public class MyWebService {
public String sayHello(String name) {
return name + " 你好!";
}
public static void main(String[] args) {
String address = "http://192.168.10.1:6666/ws";
Endpoint.publish(address, new MyWebService());
System.out.println("訪問WSDL的地址爲:" + address + "?WSDL");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
運行一下,即可開啓ws服務,請求http://192.168.10.1:6666/ws?WSDL即可看到wsdl頁面,接下來分析一下該wsdl文件中與上面程序中的對應關係,看下圖(爲了清晰的展示,圖我就不縮小了):
我們可以看到,生成的ws服務名稱是在原來的類後面有加了個Service而已,服務類型名是在原來的類後面加了個Port,包括參數默認爲arg0,返回值爲return 等等,這些都能從wsdl文件中看的出來,通過這個wsdl生成的java代碼中的類名自然也就是默認的了,如果我們想要修改這些默認的配置,則需要在編寫ws的時候通過註解來設置一下。
2. 使用註解修改wsdl配置
我們修改一下上面的ws,使用註解來配置我們自己需要的名稱,如下
/*
* 自定義ws服務, jdk1.6版本僅僅支持 soap1.1格式,jdk1.7及以上版本支持 soap1.2格式
* 發佈ws服務只需要@WebService註解即可, 如果想要更好的可維護性,則可以通過註解來實現
* */
@WebService // 默認靜態的方式是不能發佈ws服務的
(
name="MyWebService1", // 服務實現類的名稱
serviceName="MyWebServiceService1", // 默認在發佈的服務實現者的名稱後面添加Service
portName="MyWebServicePort1", // 服務類型的名稱: 默認在 發佈的服務實現者(MyWebService) 後面添加 port
targetNamespace="ws.client.test" // 發佈ws服務的命名空間,此空間默認爲當前服務包路徑的 "倒寫"此名稱也是 wsimport 命令生成 java類時默認的包路徑 -p
)
public class MyWebService {
@WebMethod(exclude=true) // 默認public方法可以發佈爲ws服務, 如果要排除則配置 exclude=true
public String sayHello(String name){
System.out.println("name:" + name);
return name + ",你好!";
}
//可以指定wsdl中的方法名,參數名和返回值
@WebMethod(operationName="sayHello")
public @WebResult(name="result") String sayHello2(@WebParam(name="name") String name,@WebParam(name="age") int age){
System.out.println("name:" + name);
return name + ",你好!,年齡爲:" + age;
}
public static void main(String[] args) {
// 一個端口可以發佈多個ws服務
String address="http://192.168.1.105/ws";
// 創建一個服務端點, banding服務的實現類
Endpoint.publish(address, new MyWebService());
System.out.println("訪問wsdl的地址爲:" + address + "?WSDL");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
通過上面這些註解,我將ws服務相關的信息給重新配置了,運行一下,來對比註解看一下生成的wsdl:
可以看出,生成的wsdl中的配置完全按照我們自己指定的來,這樣通過解析該wsdl文件得到的java代碼中的類以及方法也是按照自定義的來,這就能滿足實際中具體的要求了。