详解WebService开发中四个常见问题(2)
WebService开发中经常会碰到诸如WebService与方法重载、循环引用、数据被穿该等等问题。本文会给大家一些很好的解决方法。
问题三:循环引用
还是先来看一个例子。下面是WebService的接口:
1 @WebService2 public interface IHello {3 4 @WebMethod5 public String sayHello(Teacher teacher);6 7 }8 9 public class Teacher {10 private Student[] students;11 12 //getters and setters13 ...14 }15 16 public class Student {17 private Teacher teacher;18 19 //getters and setters20 ...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 @WebService2 public interface IHello {3 4 @WebMethod5 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 setters17 ...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了。
【编辑推荐】
详解WebService开发中四个常见问题(2)