zoukankan      html  css  js  c++  java
  • 详解WebService开发中四个常见问题(2)

    详解WebService开发中四个常见问题(2)

     

    WebService开发中经常会碰到诸如WebService与方法重载、循环引用、数据被穿该等等问题。本文会给大家一些很好的解决方法。

    AD:WOT2014:用户标签系统与用户数据化运营培训专场

    问题三:循环引用

    还是先来看一个例子。下面是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是一对多的“双向”关系。在这种情况下,我们可以想一下如何将一个Teacher对象转换成一段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竟然也会进入“死循环”。问题的根源在于对象之间的循环引用。这种问题通常在客户端发送WebService请求之前就会抛出异常,因为无法将这个对象转换为可传输的XML。

    问题四:庞然大物

    还是先看一个例子,下面是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数组,包含成百上千个Student,与上面例子不同的是Student和Teacher现在是多对一的单向关系,所以不会有“循环引用”的问题。假设所有这些Student的Teacher是一个人。我们试着将这个Student数组对象转换为一段XML,如下:

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

    问题出来了,看到了没有,每个Student节点下面都有一个Teacher节点,当这段XML被接收方转换为Student数组时,每个学生都有了一个自己的老师,Teacher对象被复制了成百上千次,经过这么一个转换--传输--转换的过程,这个数组对象真的成了一个“庞然大物”。

    问题的根源在于Student和Teacher之间的关系是多对一,当传送“多”方时,“一”方有可能会被复制多次。从而占用大量网络传输带宽和内存。在这里参数不一定非要是一个集合或者数组,例如ObjectA和ObjectB都有一个对ObjectC的引用,经过SOAP传送过后,ObjectC就由一个变成两个了,分别属于ObjectA和ObjectB,而不再是共享一个ObjectC了。

    【编辑推荐】

    1. XML WebService完全实例详细解析
    2. XML新手入门 创建构造良好的XML
    3. 实现XML和Web服务时要避免的三种常见错误
  • 相关阅读:
    Linux常用命令 rm命令详解
    Python 面向对象(一)入门篇
    Python习题集(十六)
    Python 面向对象(三)公共变量,受保护变量,私有变量
    洛谷P1309 瑞士轮(归并排序)
    185. [USACO Oct08] 挖水井
    洛谷 P1078 文化之旅(CODEVS 1316)
    CODEVS 1074 食物链 2001年NOI全国竞赛(洛谷 P2024)
    186. [USACO Oct08] 牧场旅行
    157. [USACO Nov07] 奶牛跨栏
  • 原文地址:https://www.cnblogs.com/L-H-R-X-hehe/p/3815457.html
Copyright © 2011-2022 走看看