成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解WebService開發(fā)中四個常見問題

開發(fā)
WebService開發(fā)中經(jīng)常會碰到諸如WebService與方法重載、循環(huán)引用、數(shù)據(jù)被穿該等等問題。本文會給大家一些很好的解決方法。

任何問題都需要從它的根源說起,所以簡單說一下WebService的工作原理。客戶端調(diào)用一個WebService的方法,首先需要將方法名和需要傳遞的參數(shù)包裝成XML(也就是SOAP包),通常是通過HTTP傳遞到服務(wù)器端,然后服務(wù)器端解析這段XML,得到被調(diào)用方法名稱和傳遞來的參數(shù),進而調(diào)用WebService實例的相應(yīng)方法。方法執(zhí)行完成之后,將返回的結(jié)果再包裝成XML(SOAP響應(yīng))發(fā)送到客戶端,客戶端解析這段XML,進而得到返回結(jié)果。這里關(guān)鍵的地方在于中間加入了對象和XML相互轉(zhuǎn)換的過程。

問題一:WebService與方法重載

首先說明,WebService不支持方法重載。下面舉例說明。

例如定義如下WebService接口:

1 @WebService
2 public interface IHello {
3         @WebMethod
4         public String sayHello(int id);
5
6         @WebMethod
7         public String sayHello(String name);
8        
9         @WebMethod
10         public String sayHello2(int id);
11
12         @WebMethod
13         public String sayHello2(int id, String name);
14     }

先來看方法sayHello(),如果客戶端發(fā)送如下SOAP請求:

1 <soap:Envelope>
2         <soap:Body>
3             <sayHello>
4                 <arg0>11</arg0>
5             </sayHello>
6         </soap:Body>
7     </soap:Envelope>

從SOAP請求我們可以看出客戶端需要調(diào)用方法為sayHello(),所傳遞的參數(shù)為11,但是無法知道是整數(shù)的11,還是字符串"11",所以也就無法確定所調(diào)用的方法是哪一個。

接下來看一下sayHello2(),如果客戶端傳遞的參數(shù)只包括一個id值,例如:

1 <soap:Envelope>
2         <soap:Body>
3             <sayHello2>
4                 <arg0>1</arg0>
5             </sayHello2>
6         </soap:Body>
7     </soap:Envelope>

還是無法判斷調(diào)用的是哪個方法,因為可以理解為客戶端傳遞的第二個參數(shù)為空(Null)。

通常情況下,在發(fā)布一個含有重載方法的WebService時會有異常發(fā)生,或者當調(diào)用一個方法時,服務(wù)器端報告找不到相對應(yīng)的方法。

問題二:我的數(shù)據(jù)被修改了?

先來看WebService接口:

1 @WebService
2     public interface IHello {
3    
4         @WebMethod
5         public String sayHello(IPerson person);
6    
7     }
8    
9     public interface IPerson {
10         ...
11     }
12    
13     public class Person implements IPerson{
14         ...
15     }

這里需要注意的是WebService的方法sayHello()的參數(shù)是一個接口,而不是一個具體類(例如Aegis綁定就允許直接發(fā)布這樣的WebService)。在客戶端調(diào)用sayHello()的時候傳遞一個Person對象,它實現(xiàn)了IPerson接口。經(jīng)過中間一系列的XML和對象之間的轉(zhuǎn)換過程,服務(wù)器端得到的只是一個實現(xiàn)了IPerson接口的實例,它不一定就是一個Person對象,如果要強制將其轉(zhuǎn)換為Person,就有可能拋出異常。

問題的根源在于Aegis將XML轉(zhuǎn)換為Java對象是通過Proxy或CGlib這類的工具生成一個“代理類”實現(xiàn)IPerson接口,然后創(chuàng)建這個代理類的一個實例,那它肯定不是一個Person了。

#p#

問題三:循環(huán)引用

還是先來看一個例子。下面是WebService的接口:

1 @WebService
2     public interface IHello {
3    
4         @WebMethod
5         public String sayHello(Teacher teacher);
6    
7     }
8    
9     public class Teacher {
10         private Student[] students;
11        
12         //getters and setters
13         ...
14     }
15    
16     public class Student {
17         private Teacher teacher;
18        
19         //getters and setters
20         ...
21     }

請注意,Teacher和Student是一對多的“雙向”關(guān)系。在這種情況下,我們可以想一下如何將一個Teacher對象轉(zhuǎn)換成一段XML?

您可能想到下面的答案:

1 <teacher>
2         <students>
3             <teacher>
4                 <students>
5                     <teacher>
6                         <students>
7                             ...
8                         </students>
9                         ...
10                     </teacher>
11                 </students>
12                 ...
13             </teacher>
14         </students>
15         
16         <students>
17             ...
18         </students>
19         ...
20     </teacher>

看到了吧,XML竟然也會進入“死循環(huán)”。問題的根源在于對象之間的循環(huán)引用。這種問題通常在客戶端發(fā)送WebService請求之前就會拋出異常,因為無法將這個對象轉(zhuǎn)換為可傳輸?shù)腦ML。

問題四:龐然大物

還是先看一個例子,下面是WebService的接口:

1 @WebService
2     public interface IHello {
3    
4         @WebMethod
5         public String sayHello(Student[] students);
6    
7     }
8    
9     public class Teacher {
10         ...
11     }
12    
13     public class Student {
14         private Teacher teacher;
15        
16         //getters and setters
17         ...
18     }

這個方法接收一個Student數(shù)組,包含成百上千個Student,與上面例子不同的是Student和Teacher現(xiàn)在是多對一的單向關(guān)系,所以不會有“循環(huán)引用”的問題。假設(shè)所有這些Student的Teacher是一個人。我們試著將這個Student數(shù)組對象轉(zhuǎn)換為一段XML,如下:

1 <student>
2     <teacher>
3                 ...
4         </teacher>
5     </student>
6 <student>
7     <teacher>
8                 ...
9         </teacher>
10     </student>
11     ...

問題出來了,看到了沒有,每個Student節(jié)點下面都有一個Teacher節(jié)點,當這段XML被接收方轉(zhuǎn)換為Student數(shù)組時,每個學(xué)生都有了一個自己的老師,Teacher對象被復(fù)制了成百上千次,經(jīng)過這么一個轉(zhuǎn)換--傳輸--轉(zhuǎn)換的過程,這個數(shù)組對象真的成了一個“龐然大物”。

問題的根源在于Student和Teacher之間的關(guān)系是多對一,當傳送“多”方時,“一”方有可能會被復(fù)制多次。從而占用大量網(wǎng)絡(luò)傳輸帶寬和內(nèi)存。在這里參數(shù)不一定非要是一個集合或者數(shù)組,例如ObjectA和ObjectB都有一個對ObjectC的引用,經(jīng)過SOAP傳送過后,ObjectC就由一個變成兩個了,分別屬于ObjectA和ObjectB,而不再是共享一個ObjectC了。

【編輯推薦】

  1. XML WebService完全實例詳細解析
  2. XML新手入門 創(chuàng)建構(gòu)造良好的XML
  3. 實現(xiàn)XML和Web服務(wù)時要避免的三種常見錯誤
責任編輯:彭凡 來源: ITPUB
相關(guān)推薦

2012-06-12 09:37:26

2009-07-24 15:35:00

ASP.NET連接Or

2009-11-02 17:25:04

ADSL常見問題

2009-12-31 09:58:51

Ubuntu常見問題

2010-07-12 14:13:15

SQL Server開

2024-07-01 08:23:20

2015-05-15 09:37:24

iOS開發(fā)爭議

2022-10-26 14:55:53

AIoT物聯(lián)網(wǎng)人工智能

2021-11-29 18:07:50

軟件安全網(wǎng)絡(luò)攻擊漏洞

2021-11-02 10:08:25

安全左移網(wǎng)絡(luò)安全漏洞

2021-08-24 10:51:19

多云云計算云平臺

2012-03-06 08:47:40

Corona

2020-10-18 12:00:27

前端開發(fā)架構(gòu)

2020-05-25 22:41:27

LoRaWAN物聯(lián)網(wǎng)技術(shù)物聯(lián)網(wǎng)

2012-11-14 14:39:21

2024-11-04 15:49:02

2018-09-29 09:19:44

布線數(shù)據(jù)中心串擾

2009-10-19 11:33:22

數(shù)據(jù)中心綜合布線

2013-05-10 10:39:15

2015-11-16 09:12:40

android問題開發(fā)
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 在线激情视频 | 中文字幕国产一区 | 国产精品一区二区三区在线 | www.久| 福利网址 | 全免费a级毛片免费看视频免费下 | 男女羞羞视频大全 | 2019天天操 | 毛片免费看 | 丝袜 亚洲 另类 欧美 综合 | 久久精品国产亚洲 | 成人一区二区在线 | 激情五月综合 | 久久久精品视频一区二区三区 | 成人国产精品久久 | 亚洲 中文 欧美 日韩 在线观看 | 欧美精品在线播放 | 啪啪免费网站 | 日韩精品免费看 | 色综合天天综合网国产成人网 | 爱综合| av男人的天堂av | 色婷婷av一区二区三区软件 | 人人做人人澡人人爽欧美 | 日韩精品 电影一区 亚洲 | 99精品国自产在线 | 亚洲国产成人精品女人久久久 | 欧美精 | 亚洲精品99999| 日韩电影一区二区三区 | 亚洲福利一区二区 | 另类亚洲视频 | 一本久久a久久精品亚洲 | 国产精品久久国产精品99 | 日韩一区在线播放 | 日韩在线免费视频 | 第四色播日韩第一页 | 亚洲电影一区二区三区 | 久久中文字幕电影 | 最近中文字幕第一页 | 一区二区在线 |