转载——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得到我们想要的服务结果了,简单方法,将刚才生成的测试类的方法略作修改,即可运行。如下:
这正是我们想要的结果。
关于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
助人等于自助! 3w@live.cn
转载——Java与WCF交互(一):Java客户端调用WCF服务的更多相关文章
- 客户端调用 WCF 的几种方式
转载网络代码.版权归原作者所有..... 客户端调用WCF的几种常用的方式: 1普通调用 var factory = new DataContent.ServiceReference1.Custome ...
- Silverlight客户端调用WCF服务难题解疑
一:解决办法 Silverlight客户端调用WCF服务在实际使用中经常会出现的问题就是无法直接应用类文件和配置文件.微软针对这一情况已经给出了解决办法.WCF开发框架可以帮助我们实现可靠性较高的跨平 ...
- SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)
1.概念:Restful 基础架构 2.具体内容 对于 Rest 基础架构实现处理是 SpringCloud 核心所在,其基本操作形式在 SpringBoot 之中已经有了明确的讲解,那么本次为 了清 ...
- XFire客户端调用CXF服务端(四)
前面章节:http://www.cnblogs.com/xiehongwei/p/8082337.html 已经开发出了CXF服务端,现在用XFire开发客户端调用CXF服务端,代码如下: impor ...
- Java与WCF交互(一):Java客户端调用WCF服务 【转】
原文:http://www.cnblogs.com/downmoon/archive/2010/08/24/1807161.html 最近开始了解WCF,写了个最简单的Helloworld,想通过ja ...
- Java与WCF交互(一):Java客户端调用WCF服务
最近开始了解WCF,写了个最简单的Helloworld,想通过java客户端实现通信.没想到以我的基础,居然花了整整两天(当然是工作以外的时间,呵呵),整个过程大费周折,特写下此文,以供有需要的朋友参 ...
- Elasticsearch java客户端调用cat服务
开发环境,测试环境,预发环境和生产环境一般相互隔离的,使用开发环境或者测试环境可以使用cat来查看索引的情况 例如: 但预防环境和测试环境是不允许访问的,那怎么办呢? 可以使用后台来查看上述信息,提供 ...
- java版gRPC实战之六:客户端动态获取服务端地址
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- 【Java EE 学习 80 下】【调用WebService服务的四种方式】【WebService中的注解】
不考虑第三方框架,如果只使用JDK提供的API,那么可以使用三种方式调用WebService服务:另外还可以使用Ajax调用WebService服务. 预备工作:开启WebService服务,使用jd ...
随机推荐
- Python学习笔记:装饰器
Python 装饰器的基本概念和应用 代码编写要遵循开放封闭原则,虽然在这个原则是用的面向对象开发,但是也适用于函数式编程,简单来说,它规定已经实现的功能代码不允许被修改,但可以被扩展,即: 封闭:已 ...
- python标准模块
sys模块 这是一个跟python解释器关系密切的标准库.它提供了一些和python解释器操作密切的属性和函数. sys中常用的函数和属性: sys.argv: sys.argv是专门用来向pytho ...
- 100个经典C语言程序(益智类)
100个经典C语言程序(益智类) [1.绘制余弦曲线] 在屏幕上用“*”显示0~360度的余弦函数cos(x)曲线 [问题分析与算法设计] 利用cos(x)的左右对称性,将屏幕的行方向定义为x,列方向 ...
- LoadRunner11的安装和使用及其注意点(测试系统是win7)
一.安装 LoadRunner11的下载地址:http://www.ddooo.com/softdown/61971.htm 链接标题里[loadrunner11 中文破解版]实质上下载下来是没有破解 ...
- c++ 吕凤翥 第五章 类对象一
一 类的声明和实现 1. class tdate //声明部分 { public: void setdate(int y,int m,int d); int isleapyear(); voi ...
- 实战小项目之IMX6 VPU使用
项目简介 基于官方的demo进行修改,限于能力问题,并没有将功能代码完全从官方的demo中分离出来,还是基于原来的框架进行修改,做了一些简单的封装,我做的工作如下: 使用自己的采集程序 定义6中工作模 ...
- python 中输入一个字符串,判断这个字符串中有多少个字符、数字、空格、特殊字符
# -*- coding: utf8 -*- # Author:wxq #python 2.7 #首先定义一个字符串 str1 = raw_input('请输入一个字符:') #初始化字符.数字.空格 ...
- Python机器学习数据挖掘工具sklearn安装和使用
python借助pip安装第三方库,所以首先确保电脑上已成功安装了pip. 安装sklearn前需要先安装numpy.scipy和pandas等库.安装的方式有两种: 一.前往python的组件库页( ...
- 将数据缓存到sessionStorage中
//获取侧边栏 if (sessionStorage.getItem(`${env}${empId}leftMenu`)) { const leftMenu = JSON.parse(sessionS ...
- java _tomcat_mysql 部署
项目做完了,要发布了,而Java的特长之一就是移植性好,面对着微软的XP的停止服务,Windows系统的“独裁”,越来越多的商家选择了开源的免费的linux系统作为服务器.因为linux系统也有图形界 ...