JAVA 用 Apache CXF 调用 .NET 服务端 WebService

JAVA 用 Apache CXF 调用 .NET 服务端 WebService

分类: Web Service 796人阅读 评论(4) 收藏 举报
.net .NET .Net cxf CXF java Java JAVA webservice WebService webService

Web Service涉及的相关概念和基础知识不赘述了,想了解的请看这篇文章:http://blog.csdn.net/shb_derek/article/details/8018287

下面从头开始介绍怎样编写JAVA代码来调用Web Service:

1、首先去官网(http://cxf.apache.org/download.html)下载Apache CXF,选择最新版本的 apache-cxf-2.7.0.zip 下载(注:该本版本用jdk1.6编译,所以楼下报错的朋友有可能是jdk版本的原因)。

2、下载到本地后,将文件解压缩,可以看到有bin、docs、lib、samples等目录:

bin中存放的是批处理文件,一会儿需要用到其中的wsdl2java.bat文件来生成Web Service客户端调用代码;lib中存放的是开发Web Service需要用到的jar包(本例中引入部分jar包即可,不需要全部引入);samples中是用CXF开发WebService的例子代码,如果还不熟悉建议看看以java_first开头的五个例子,相信看完后上手会很快。

3、网上找了个.NET编写的Web Service天气预报的服务端(http://www.webxml.com.cn/WebServices/ChinaZipSearchWebService.asmx),提供的WSDL链接:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl

4、打开CMD命令行窗口,切换到apache-cxf-2.7.0/bin目录下,输入命令:wsdl2java -p cn.com.webxml -d f:/ http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl

-p 表示生成的JAVA客户端调用代码的包路径;-d 表示生成在本地哪个目录下(本例为F盘根目录); 最后一个参数为WSDL文件路径(也可以是本地文件),关于命令参数的具体内容可以参考:https://cwiki.apache.org/CXF20DOC/wsdl-to-java.html。如果亲自实践,可以看到命令行中会报如下错误,预期的代码并没有生成:

JAVA 用 Apache CXF 调用 .NET 服务端 WebService_第1张图片


出错的原因从命令行反馈的信息大致可以判断出第44行和85行有错误。

5、既然有错误,就得想办法解决。浏览器中CTRL+S直接将WSDL的内容保存到本地(本例中保存文件名为weather.wsdl)并注释掉44和85行的<s:element ref="s:schema" />,然后将4步骤中的URL替换成weather.wsdl:wsdl2java -p cn.com.webxml -d f:/ weather.wsdl,可以看到CMD中没有报错并且F盘下多了个cn文件夹,里面有很多java文件,这表明第一项工作已完成。

6、Eclipse中新建JAVA工程,导入部分jar包,并拷贝上步生成的cn文件夹到src下如下图:

JAVA 用 Apache CXF 调用 .NET 服务端 WebService_第2张图片JAVA 用 Apache CXF 调用 .NET 服务端 WebService_第3张图片

注释掉WeatherWebService.java中存在错误信息的三个构造方法,这样Web Service客户端调用代码就算搞定了。

7、将之前保存到本地的weather.wsdl文件拷贝到src下,编写测试代码:

[java] view plain copy print ?
  1. public class WeatherTest {
  2. public static void main(String[] args) throws Exception {
  3. java.net.URL wsdlLocation = ClassLoader.getSystemResource("weather.wsdl");
  4. JaxWsDynamicClientFactory dcf =JaxWsDynamicClientFactory.newInstance();
  5. //方式1. 指定classpath下的WSDL文件
  6. org.apache.cxf.endpoint.Client client = dcf.createClient(wsdlLocation);
  7. //方式2. 指定WSDL文件的绝对路径
  8. //dcf.createClient("D:/apache-cxf-2.7.0/bin/weather.wsdl");
  9. Object[] provinces = client.invoke("getSupportProvince");
  10. if(provinces != null && provinces.length > 0) {
  11. for(Object province : provinces) {
  12. System.out.println(((ArrayOfString)province).getString());
  13. }
  14. }
  15. Object[] citys = client.invoke("getSupportCity","浙江");
  16. if(citys != null && citys.length > 0) {
  17. for(Object city : citys) {
  18. System.out.println(((ArrayOfString)city).getString());
  19. }
  20. }
  21. Object[] weathers = client.invoke("getWeatherbyCityName", "杭州");
  22. if(weathers != null && weathers.length > 0) {
  23. for(Object weather : weathers) {
  24. System.out.println(((ArrayOfString)weather).getString());
  25. }
  26. }
  27. }
  28. }
8、Run As -> Java Appliaction,控制台输出天气信息,OK!


JAVA 用 Apache CXF 调用 .NET 服务端 WebService_第4张图片

你可能感兴趣的:(Web,service)