问题二:我的数据被修改了?
先来看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 }
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()的参数是一个接口,而不是一个具体类(例如Aegis绑定就允许直接发布这样的WebService)。在客户端调用sayHello()的时候传递一个Person对象,它实现了IPerson接口。经过中间一系列的XML和对象之间的转换过程,服务器端得到的只是一个实现了IPerson接口的实例,它不一定就是一个Person对象,如果要强制将其转换为Person,就有可能抛出异常。
问题的根源在于Aegis将XML转换为Java对象是通过Proxy或CGlib这类的工具生成一个“代理类”实现IPerson接口,然后创建这个代理类的一个实例,那它肯定不是一个Person了。