Java调用.NET的WCF
最近開始了解WCF。寫了個最簡單的Helloworld,想通過java客戶端實現(xiàn)通信。沒想到以我的基礎(chǔ),居然花了整整兩天(當(dāng)然是工作以外的時間,呵呵),整個過程大費周折,特寫下此文,以供有需要的朋友參考:
第一步:生成WCF服務(wù)
新建WCF解決方案,分別添加三個項目,HelloTimeService(類庫),HelloTimehost(控制臺程序),HelloTimeClient(控制臺程序),項目結(jié)構(gòu)如圖:
各個項目的主要代碼:
service:
Host:
Client:
編譯通過后,測試Host和Client分別成功:
保持Host程序打開,這樣,WCF服務(wù)就一直可以被外部程序調(diào)用。當(dāng)然也包括Java客戶端。
我們看看生成的WSDL
第二步:調(diào)用WCF生成的WSDL生成java客戶端。
首先,請允許我介紹下axis2,它的官方地址:http://ws.apache.org/axis2/
這是一個java平臺的web service解決方案。我們最常用的是WSDL2Java和Java2WSDL兩個功能。
關(guān)于Web service的另一個解決方案是xFire,我沒試過。
關(guān)于命令行執(zhí)行WSDL2Java,我也沒有執(zhí)行成功! 我這里介紹的是Code Generator Wizard - eclipse Plug-in,一個Eclipse的插件。而且是在參考了眾多解決方案才配置成功!
特別感謝yycxbjl的這篇文章:http://www.cnblogs.com/yycxbjl/archive/2010/06/14/1758063.html
我的Java整個配置環(huán)境:
1.安裝JDK并配置環(huán)境變量
JAVA_HOME=D:/2000/Java/JDKUpdate(注意,不帶版本號是為了以后升級時只復(fù)制文件,而不必修改環(huán)境變量。)
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(注意,不帶版本號是為了以后升級時只復(fù)制文件,而不必修改環(huán)境變量。)
由于安裝的是tomcat6.0不用配置tomcat的環(huán)境變量,至于以前的版本可以查資料。
需要設(shè)置TOMCAT_HOME,CATAlINA等環(huán)境變量
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,原因(據(jù)yycxbjl說:“最新版的 1.5.0 與 1.5.1 中沒有 backport-util-concurrent-3.1.jar, 無法解決:使用axis2-eclipse-codegen-wizard插件,從wsdl文件生成java文件時出錯無法繼續(xù)的問題,故不使用。)
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 (連壓縮包中的根目錄一起解壓出來)。也可以用傳統(tǒng)的link方法部署。
復(fù)制 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,(這是整個部署的關(guān)鍵!這里邀月折騰了整整一天!)
新建一個Java project,命名為GetWCFInfoByJavaClient,并在新項目中添加新向?qū)?#xff0c;File-New
此時,我們可以看到期待已久的wizard界面:
此進(jìn),在新建的GetWCFInfoByJavaClient項目中建一個package,命名為org.tempuri,與前面自定義的命名空間一致。將生成的兩個類文 件,ServiceCallbackHandler.java和ServiceStub.java文件添加進(jìn)來,并在jreSE1.6庫中添加d:/2000/Java/Axis2/lib下所有jar文件的引用。
注意此時有個特殊的文件,即Axis2_Codegen_Wizard_1.4.1/lib/axis2-1.4.1.jar,需要手動復(fù)制到d:/2000/java/axis2/lib下并添加到項目的jre庫中,這是邀月第二個卡殼的地方,琢磨了好久,慎之慎之。
項目的結(jié)構(gòu)應(yīng)該如下圖:
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.
試了下,我的默認(rèn)jre環(huán)境果然是JDK5,于是換為jre system library
終于編譯成功!看到曙光了,
此時,最后的工作就是在Main中調(diào)用stub得到我們想要的服務(wù)結(jié)果了,簡單方法,將剛才生成的測試類的方法略作修改,即可運行。如下:
這正是我們想要的結(jié)果。
關(guān)于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 創(chuàng)建獨立 Web Services 應(yīng)用程序,第 1 部分: Web Services 服務(wù)端應(yīng)用程序(該鏈接需要先注冊)
https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-eclipse-javase1/section2.html
小結(jié): 這雖然只是一個簡單的demo,但我問了許多人,并在論壇發(fā)問,可是由于使用環(huán)境的不同,最終沒找到類似的環(huán)境,只好自己摸索實踐,好在還有一點點java基礎(chǔ),另外網(wǎng)上幾個論壇像javaeye提供的答案過于陳舊,這正是java初學(xué)者苦惱之處,這點來看,微軟的開發(fā)環(huán)境無論如何是值得稱贊的,至少它不用跑到別的地盤去問答案。eclipse/tomcat/axis等代表的服務(wù)器和開發(fā)環(huán)境、插件配置非常的讓初學(xué)者無奈!因為你不知道某個jar是 否與其他幾千個jar很好的兼容。不知道java高手們是否指一條明道,非常感謝!并再次感謝yycxb
下篇文章介紹WCF客戶端如何調(diào)用java的web service,那要簡單多了。敬請關(guān)注。
附:WCF的配置文件:
主要說說JAVA如何調(diào)用WCF服務(wù)。
Java環(huán)境下生成代理類的工具有很多,如wsdl2Java,wsimport 等。本文中使用的工具是wsimport。
wsdl2Java 生成命令實例:
?
| 1 | wsdl2Java -p packageName -d C:\ProxyClass http://127.0.0.1/WcfService/TestService.svc?wsdl |
命令說明:
-p:生成文件的包名稱
-d: 生成路徑
后面就是wsdl的地址,如果用服務(wù)地址(不帶?wsdl)貌似不行
Java環(huán)境下的都是包結(jié)構(gòu),和C#不一樣。
本文使用wsimport生成代理調(diào)用了WCF服務(wù)。
調(diào)用步驟:
1、在Java工程所在的文件夾中建立文件夾,以放置生成的Java文件。如下圖:
2、針對不同的服務(wù)生成代理,以放在不同的文件夾中:如生成LoginService.svc的命令如下:
注意以上紅色標(biāo)識部分:為存放的文件夾名稱。運行以上命令后生成的文件如下:
重復(fù)1、2 生成其他服務(wù)的代理。主要修改的就是存放路徑與服務(wù)地址。
3、在工程的src中右鍵添加包(注意:這里的包名稱需通命令中指定的包名次相同),如下圖:
4、將生成的文件復(fù)制到包中
5、調(diào)用:
public static void main(String[] args) {// TODO Auto-generated method stub LoginService loginService=new LoginService();ILogin loginProxy= loginService.getBasicHttpBindingILogin();String token= loginProxy.login("admin","123456");System.out.println(token);}運行結(jié)果:
使用分布式編程,很方便不同編程語言之間互相訪問,但也必須注意一些技術(shù)細(xì)節(jié),實現(xiàn)起來才能暢通無阻,取得事半功倍的效果。
首先,創(chuàng)建一個WCF。使用原有網(wǎng)站或新建一個網(wǎng)站,并將端口動態(tài)改為固定,如設(shè)成8000。在網(wǎng)站中添加WCF服務(wù),取名字為:GetAccountService.svc,這時同時生成了一個接口:IGetAccountService.cs和一個實現(xiàn)類:GetAccountService.cs,并且有一個默認(rèn)方法。我們?yōu)榱藴y試對數(shù)據(jù)庫的訪問,將方法改為:GetAccount。
完成的代碼如下:
1.IGetAccountService.cs
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的Java调用.NET的WCF的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 标致408油耗怎么样 详解标致408的油
- 下一篇: n+电子烟在哪里可以买得到?