Netbeans官方网站有专门的文章和Demo介绍如何使用Netbeans开发Web Service,主要写稿人是Arun Gupta,印度人,很厉害,去java.net看看他的blog。
但是这些文章和Demo都说的很简单,开发的Web Service无非就是几个可以传输String字符的Service,但是平常我们所需要的绝不是“Hello Duke”那么简单,我们大部分情况都需要返回一个完整的也许是复杂的对象。我按照官方的Demo尝试了一下,发现传输复杂对象的时候经常会出莫名的问题,有些是成功的,有些就失败。
比如:
1. 单个简单javabean,pojo,成功。
2. 单个复杂的javabean,元素包含另外复杂对象(如单个ArrayList,2个以上的ArrayList就不行),成功。
3. 多个简单的javabean,返回list对象,list中包含内容为javabean,有时候就会出问题(注意,是有时候)。如下(getArr2是出问题的方法)
Exceptions details : java.lang.reflect.InvocationTargetException
我查了官方的说法,Enterprise Pack5.5中主要用到jax-ws和jaxb技术,按理应该是可以用XML实现java对象绑定,可我实践的时候大部分情况都是不成功的,只有一次成功,幸运的是我保留了下来。下载代码
该代码中,有一个是失败的,web服务方法为getArr2(),其他都是可以成功调用的。失败的情况经常报错:** nor any of its super class is known to this context, 我不清楚该去什么地方修改这个Context。
有兴趣的朋友可以一起看看,有问题可以讨论一下,我的mail: qil.wong@gmail.com。 我没有手动改过wsdl等文件,都是Netbeans IDE自动生成的,如果真有问题,可能就是Netbeans不稳定造成的。成功的那部分代码我是在Ubuntu Linux下写的,本来我以为不会有问题存在,但是过了五一我又在Ubuntu中新增了一个方法(就是getArr2()),错误出现了。拿到XP下测试,成功的那几个还是成功的,失败的还是失败,再写几个复杂对象的传输的service,还是失败。
我现在自己得出的结论是:在自己的javabean中,不能连续两个嵌套的List存在,否则就会出问题。
如果不是两个嵌套的List存在,但是也发生了异常,诸如:...nor any of its super class is known to this context。我的解决办法是先写一个最简单的引用该javabean的WebMethod,经编译部署测试后一般都会成功,然后再写复杂的Javabean处理的WebMethod;另外,我在java.net上看到修改WebMethod方法有时候也会有用,不过我没试成功。
希望JAXB2.1或以后的版本可以解决这个问题。
这个问题我会报告给jax-ws,jaxb,是否是xml绑定出了问题。
PS: 我又在Tomcat下做了几个实验,居然很好,什么样的复杂的javabean都可以进行传递。
看样子真是glassfish还不是完全成熟啊!