当前位置:编程学习 > JAVA >>

Java与WCF交互(一):Java客户端调用WCF服务

第一步:生成WCF服务

新建WCF解决方案,分别添加三个项目,HelloTimeService(类库),HelloTimehost(控制台程序),HelloTimeClient(控制台程序),项目结构如图:

邀月工作室

各个项目的主要代码:
service:
邀月工作室

Host:
邀月工作室

Client:
邀月工作室

编译通过后,测试Host和Client分别成功:
邀月工作室

邀月工作室

保持Host程序打开,这样,WCF服务就一直可以被外部程序调用。当然也包括Java客户端。

我们看看生成的WSDL

邀月工作室

邀月工作室

第二步:调用WCF生成的WSDL生成java客户端。

这是一个java平台的web service解决方案。我们最常用的是WSDL2Java和Java2WSDL两个功能。

关于Web service的另一个解决方案是xFire,我没试过。

关于命令行执行WSDL2Java,我也没有执行成功! 我这里介绍的是Code Generator Wizard - eclipse Plug-in,一个Eclipse的插件。而且是在参考了众多解决方案才配置成功!

新建一个Java projec t,命名为 GetWCFInfoByJavaClient,并在新项目中添加新向导,File-New

此时,我们可以看到期待已久的wizard界面:
邀月工作室

邀月工作室

邀月工作室

邀月工作室

邀月工作室

邀月工作室

此进,在新建的 GetWCFInfoByJavaClient 项目中建一个package,命名为org.tempuri,与前面自定义的命名空间一致。将生成的两个类文件,ServiceCallbackHandler.java和ServiceStub.java文件添加进来,并在jreSE1.6库中添加 d:2000JavaAxis2lib下所有jar文件的引用。

注意此时有个特殊的文件,即Axis2_Codegen_Wizard_1.4.1libaxis2-1.4.1.jar,需要手动复制到d:2000javaaxis2lib下并添加到项目的jre库中,这是邀月第二个卡壳的地方,琢磨了好久,慎之慎之。

项目的结构应该如下图:

邀月工作室

eclipse的命名空间提示就是比vs强啊!很喜欢Ctrl+1。呵呵。微软要是能做到这点,那该多好啊!

要命的是,此时库都添加完成,检查代码也无误,居然编译错误,提示:

Access restriction: The type AxisFault is not accessible due to restriction on required library D:2000JavaAxis2libaxis2-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得到我们想要的服务结果了,简单方法,将刚才生成的测试类的方法略作修改,即可运行。如下:
邀月工作室

小结 :这虽然只是一个简单的demo,但我问了许多人,并在论坛发问,可是由于使用环境的不同,最终没找到类似的环境,只好自己摸索实践,好在还有一点点 java基础,另外网上几个论坛像javaeye提供的答案过于陈旧,这正是java初学者苦恼之处,这点来看,微软的开发环境无论如何是值得称赞的,至少它不用跑到别的地盘去问答案。eclipse omcataxis等代表的服务器和开发环境、插件配置非常的让初学者无奈!因为你不知道某个jar是否与其他几千个jar很好的兼容。不知道java高手们是否指一条明道,非常感谢!并再次感谢yycxb

下篇文章介绍WCF客户端如何调用java的web service,那要简单多了。敬请关注。


 附:WCF的配置文件:

view plaincopy to clipboardprint?
<?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> 
       

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,