Java与WCF交互

Java与WCF交互

浏览:91

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

最近开始了解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 下 添加

<library name="lib/backport-util-concurrent-3.1.jar">
<export name="*"/>
</library>
<library name="lib/geronimo-stax-api_1.0_spec-1.0.1">
<export name="*"/>
</library>

将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得到我们想要的服务结果了,简单方法,将刚才生成的测试类的方法略作修改,即可运行。如下:

这正是我们想要的结果。

小结:

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

附: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交互(二):WCF客户端调用Java web service

在上篇《 Java与WCF交互(一):Java客户端调用WCF服务》中,我介绍了自己如何使用axis2生成java客户端的悲惨经历。有同学问起使用什么协议,经初步验证,发现只有wsHttpBinding可行,而NetTcpBinding不可行,具体原因待查。昨晚回去重新测试WCF客户端调用Java Web Service,并将过程公布如下:

其实本不需要做web service,只是原来公开的经典的Web service像(http://soapinterop.java.sun.com/round2.base?WSDL)等不可访问了。于是邀月重写了一个本地的web service,以作演示。

第一步:建立本地java环境,并构建 web Service代码,发布web service

1、设置Java环境:

JDK6/J2SE1.6以上,必须!!后面邀月会说明原因。

Eclipse 3.6

Axis2_Codegen_Wizard_1.4.1插件,配置见上文《 Java与WCF交互(一):Java客户端调用WCF服务》

假定以上环境都OK

2、Services 服务端应用程序

在Eclipse中新建一个java project,名为JavaServiceForWCFClient,如图:

选择一个运行时库

在src下新建一个package,如图:

在该package下新建一个类HelloTimeForWCF,代码如下:

请注意上图中:@WebService的使用。这称为 Annotation 或元数据,由 Java SE 5 中引入的 Web Services 元数据规范 (Web Services Metadata Specification) 所使用。开发人员在对类和方法应用 Annotation 之前定义类和方法,以向运行时引擎指明如何将类及其方法作为 Web Services 和 Web Services 操作来启用。Java SE 6 附带了这样一个引擎。@WebService Annotation 将 SayHello 类标记为实现某个 Web Services ,从而产生可部署的 Web Services 。这个特定的 Annotation 是一个 WSDL 映射 Annotation,并将 Java 源代码与表示 Web Services 的 WSDL 元素相关联。(注:本段内容来自IBM官方网站,https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-eclipse-javase1/section3.html)

下一步,就是Ant工具大派用场的时候了,

在项目根路径下新建一build.xml,内容如图:

以"Ant Build"方式运行该文件:

应该在控制台收到如下信息:

以上信息,表明ant创建成功!此时,刷新项目视图,应该得到如图所示的结果,其中黄色部分为刚生成的内容:

在package中新增一个主类,是否感觉有点像WCF中的Host引擎?其实作用就是如此。

其内容如下:

运行程序,就如同运行WCF中的Host:

可以用内部的浏览器来浏览这个地址:http://localhost:8080/JavaServiceForWCFClient?wsdl

至此,Java web端部署完成。

第二步:建立本地WCF客户端,调用第一步生成的web service

新建一个普通的控制台项目,名为WCFClientFromJava,,并按下图所示使用SvcUtil命令:(Svcutil.exe,ServiceModel 元数据实用工具用于依据元数据文档生成服务模型代码,以及依据服务模型代码生成元数据文档。ServiceModel 元数据实用工具可在 Windows SDK 安装位置中找到,一般位置为 C:\Program Files\Microsoft SDKs\Windows\v6.0\Bin)

生成后,将生成的文件包含在项目中,项目结构如下:

生成的app.config文件如下:

此时,在program.cs文件中添加如下方法:

至此,WCF客户端调用Java Web service成功!


频道:Java