这几天一直在学习如何调用WebService。想写一个调用查询天气的WebService的Demo。
(天气查询WebService地址:http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx?WSDL)
1,首先学习了CXF。在使用CXF\bin下的wsdl2java命令生成java类时,报一个“...no found s:schema.....”的错误,经网上查询,是因为无法解析xml下的ref属性。解决方法网上有2种,第一个:删除<s:element ref="s:schema"/>,第二个:将<s:element ref="s:schema"/><s:any/>变为<s:any minOccurs="2" maxOccurs="2"/>。
以上2种方法,我都亲自测试过,都可以通过命令生成java类。
我在公司时,jdk为1.6,当时生成java类后,通过new 生成类,然后通过生成类的方法,就可以调用webservice的方法了。
可是回到家,再次测试竟然通不过了。我百思不得其解,重复操作,怎样都有问题。我将在公司做好的demo导入笔记本中,测试是通过的。所以我个人认为是否跟jdk版本有关系呢。
折腾到11点多,决定更换别的方法调用webService。
2,Axi2调用WebService。
通过Axi2\bin下的命令,如下:
wsdl2java -uri http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx?WSDL
直接生成java类,这里生成java类只有2个,跟cxf生成的不同。cxf生成了很多类。Axi2也会生成很多类,但是它把很多类都写成内部类了。所以外表看起来至生成了2个java文件。
将生成文件copy到对应包下,测试通过。一切ok