最近开始了解wcf,写了个最简单的helloworld,想通过java客户端实现通信。没想到以我的基础,居然花了整整两天(当然是工作以外的时间,呵呵),整个过程大费周折,特写下此文,以供有需要的朋友参考:
第一步:生成wcf服务
新建wcf解决方案,分别添加三个项目,hellotimeservice(类库),hellotimehost(控制台程序),hellotimeclient(控制台程序),项目结构如图:
各个项目的主要代码:
service:
host:
client:
编译通过后,测试host和client分别成功:
保持host程序打开,这样,wcf服务就一直可以被外部程序调用。当然也包括java客户端。
我们看看生成的wsdl
第二步:调用wcf生成的wsdl生成java客户端。
首先,请允许我介绍下axis2,它的官方地址:http://ws.apache.org/axis2/
这是一个java平台的web service解决方案。我们最常用的是wsdl2java和java2wsdl两个功能。
关于web service的另一个解决方案是xfire,我没试过。
关于命令行执行wsdl2java,我也没有执行成功! 我这里介绍的是code generator wizard - eclipse plug-in,一个eclipse的插件。而且是在参考了众多解决方案才配置成功!
特别感谢yycxbjl的这篇文章:http://www.cnblogs.com/yycxbjl/archive/2010/06/14/1758063.html
我的java整个配置环境:
1.安装jdk并配置环境变量
java_home=d:\2000\java\jdkupdate(注意,不带版本号是为了以后升级时只复制文件,而不必修改环境变量。)
path=%java_home%\bin;
classpath=.;%java_home%\lib;%java_home%\lib\tools.jar
2.下载并安装eclipse3.6,就是大家熟悉的太阳神helios(解压即可)
解压到:d:\2000\java\eclipse
3.下载tomcat6.0.29(本文中使用的是绿色版,故解压即完成)
解压到:d:\2000\java\tomcat(注意,不带版本号是为了以后升级时只复制文件,而不必修改环境变量。)
由于安装的是tomcat6.0不用配置tomcat的环境变量,至于以前的版本可以查资料。
需要设置tomcat_home,catalina等环境变量
4.从 http://ws.apache.org/axis2/download/1_4_1/download.cgi下载 axis2-1.4.1-bin.zip
解压到:d:\2000\java\axis2,注意不要下载axis2 1.5.1,原因(据yycxbjl说:“最新版的 1.5.0 与 1.5.1 中没有 backport-util-concurrent-3.1.jar, 无法解决:使用axis2-eclipse-codegen-wizard插件,从wsdl文件生成java文件时出错无法继续的问题,故不使用。)
5.下载1.4.1版的 axis2-eclipse-codegen-wizard 与 axis2-eclipse-service-archiver-wizard
http://ws.apache.org/axis2/tools/1_0/eclipse/wsdl2java-plugin.html#operation1
(但解压后里面显示是1.3.0, 解压到:d:\2000\java\eclipse\dropins(连压缩包中的根目录一起解压出来)。也可以用传统的link方法部署。
复制d:\2000\java\axis2\lib\backport-util-concurrent-3.1.jar 与 geronimo-stax-api_1.0_spec-1.0.1.jar
到:d:\2000\java\eclipse\dropins\axis2_codegen_wizard_1.3.0\lib,并编辑:d:\2000\java\eclipse\dropins\axis2_codegen_wizard_1.3.0\plugin.xml
在 runtime 下 添加
将axis2_codegen_wizard_1.3.0重命名为axis2_codegen_wizard_1.4.1,(这是整个部署的关键!这里邀月折腾了整整一天!)
新建一个java project,命名为getwcfinfobyjavaclient,并在新项目中添加新向导,file-new
此时,我们可以看到期待已久的wizard界面:
此进,在新建的 getwcfinfobyjavaclient项目中建一个package,命名为org.tempuri,与前面自定义的命名空间一致。将生成的两个类文件,servicecallbackhandler.java和servicestub.java文件添加进来,并在jrese1.6库中添加d:\2000\java\axis2\lib下所有jar文件的引用。
注意此时有个特殊的文件,即axis2_codegen_wizard_1.4.1\lib\axis2-1.4.1.jar,需要手动复制到d:\2000\java\axis2\lib下并添加到项目的jre库中,这是邀月第二个卡壳的地方,琢磨了好久,慎之慎之。
项目的结构应该如下图:
eclipse的命名空间提示就是比vs强啊!很喜欢ctrl+1。呵呵。微软要是能做到这点,那该多好啊!
要命的是,此时库都添加完成,检查代码也无误,居然编译错误,提示:
access restriction: the type axisfault is not accessible due to restriction on required library d:\2000\java\axis2\lib\axis2-kernel-1.4.1.jar
这下我傻眼了,于是赶紧google,这两天google.com老是无故罢工,真是祸不单行,终于找到一篇老外的文章,说是如下,即可解决:
* go to the build path settings in the project properties. windows -> preferences -> java compiler
* remove the jre system library
* add another jre with a "perfect match"
* clean and build your project again. it worked for me.
试了下,我的默认jre环境果然是jdk5,于是换为jre system library
终于编译成功!看到曙光了,
此时,最后的工作就是在main中调用stub得到我们想要的服务结果了,简单方法,将刚才生成的测试类的方法略作修改,即可运行。如下:
这正是我们想要的结果。
关于java与.net交互的其他文章,请参考:
微软示例:
java/.net interoperability with the microsoft.com web service
http://msdn.microsoft.com/en-us/library/ms953968.aspx
interoperability testing
http://msdn.microsoft.com/en-us/library/aa480510.aspx
ibm示例:使用 eclipse 和 java se 6 创建独立 web services 应用程序,第 1 部分: web services 服务端应用程序(该链接需要先注册)
小结:这虽然只是一个简单的demo,但我问了许多人,并在论坛发问,可是由于使用环境的不同,最终没找到类似的环境,只好自己摸索实践,好在还有一点点java基础,另外网上几个论坛像javaeye提供的答案过于陈旧,这正是java初学者苦恼之处,这点来看,微软的开发环境无论如何是值得称赞的,至少它不用跑到别的地盘去问答案。eclipse\tomcat\axis等代表的服务器和开发环境、插件配置非常的让初学者无奈!因为你不知道某个jar是否与其他几千个jar很好的兼容。不知道java高手们是否指一条明道,非常感谢!并再次感谢yycxb
下篇文章介绍wcf客户端如何调用java的web service,那要简单多了。敬请关注。
附:wcf的配置文件:
xml version="1.0" encoding="utf-8" ?>
configuration>
system.web>
compilation debug="true" />
system.web>
system.servicemodel>
services>
service name="sample.wcf.hellotimeforjava.service" behaviorconfiguration="myservicetypebehaviors">
endpoint address="hellotimeservice" binding="wshttpbinding" contract="sample.wcf.hellotimeforjava.iservice">
identity>
dns value="localhost" />
identity>
endpoint>
endpoint address="mex" binding="mexhttpbinding" contract="imetadataexchange" />
host>
baseaddresses>
add baseaddress="http://localhost:8000/" />
baseaddresses>
host>
service>
services>
behaviors>
servicebehaviors>
behavior name="myservicetypebehaviors">
servicemetadata httpgetenabled="true" httpgeturl=""/>
servicedebug includeexceptiondetailinfaults="false" />
behavior>
servicebehaviors>
behaviors>
system.servicemodel>
configuration>
相关链接:
java与wcf交互(一)补充:用wsimport生成wsdl的java客户端代码
java与wcf交互(二):wcf客户端调用java web service
======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/