邀月

          從.net中走來(lái)的Java愛(ài)好者
          posts - 22, comments - 10, trackbacks - 0, articles - 0
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          Java與WCF交互(一):Java客戶端調(diào)用WCF服務(wù)

          Posted on 2010-08-24 15:21 邀月 閱讀(11428) 評(píng)論(2)  編輯  收藏 所屬分類(lèi): Eclipse

          最近開(kāi)始了解WCF,寫(xiě)了個(gè)最簡(jiǎn)單的Helloworld,想通過(guò)java客戶端實(shí)現(xiàn)通信。沒(méi)想到以我的基礎(chǔ),居然花了整整兩天(當(dāng)然是工作以外的時(shí)間,呵呵),整個(gè)過(guò)程大費(fèi)周折,特寫(xiě)下此文,以供有需要的朋友參考:

          第一步:生成WCF服務(wù)

          新建WCF解決方案,分別添加三個(gè)項(xiàng)目,HelloTimeService(類(lèi)庫(kù)),HelloTimehost(控制臺(tái)程序),HelloTimeClient(控制臺(tái)程序),項(xiàng)目結(jié)構(gòu)如圖:
          邀月工作室
          各個(gè)項(xiàng)目的主要代碼:
          service:
          邀月工作室

          Host:
          邀月工作室

          Client:
          邀月工作室

          編譯通過(guò)后,測(cè)試Host和Client分別成功:
          邀月工作室

          邀月工作室

          保持Host程序打開(kāi),這樣,WCF服務(wù)就一直可以被外部程序調(diào)用。當(dāng)然也包括Java客戶端。

          我們看看生成的WSDL

          邀月工作室

          邀月工作室

          第二步:調(diào)用WCF生成的WSDL生成java客戶端。

          首先,請(qǐng)?jiān)试S我介紹下axis2,它的官方地址:http://ws.apache.org/axis2/

          這是一個(gè)java平臺(tái)的web service解決方案。我們最常用的是WSDL2Java和Java2WSDL兩個(gè)功能。

          關(guān)于Web service的另一個(gè)解決方案是xFire,我沒(méi)試過(guò)。

          關(guān)于命令行執(zhí)行WSDL2Java,我也沒(méi)有執(zhí)行成功! 我這里介紹的是Code Generator Wizard - eclipse Plug-in,一個(gè)Eclipse的插件。而且是在參考了眾多解決方案才配置成功!

          特別感謝yycxbjl的這篇文章:http://www.cnblogs.com/yycxbjl/archive/2010/06/14/1758063.html

          我的Java整個(gè)配置環(huán)境:

          1.安裝JDK并配置環(huán)境變量

           JAVA_HOME=D:\2000\Java\JDKUpdate(注意,不帶版本號(hào)是為了以后升級(jí)時(shí)只復(fù)制文件,而不必修改環(huán)境變量。)
          path=%JAVA_HOME%\bin;
          classpath=.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar


          2.下載并安裝Eclipse3.6,就是大家熟悉的太陽(yáng)神Helios(解壓即可)
            解壓到:D:\2000\Java\Eclipse


          3.下載Tomcat6.0.29(本文中使用的是綠色版,故解壓即完成)
            解壓到:D:\2000\Java\tomcat(注意,不帶版本號(hào)是為了以后升級(jí)時(shí)只復(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說(shuō): “最新版的 1.5.0 與 1.5.1 中沒(méi)有 backport-util-concurrent-3.1.jar, 無(wú)法解決:使用axis2-eclipse-codegen-wizard插件,從wsdl文件生成java文件時(shí)出錯(cuò)無(wú)法繼續(xù)的問(wèn)題,故不使用。)


          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  (連壓縮包中的根目錄一起解壓出來(lái))。也可以用傳統(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,(這是整個(gè)部署的關(guān)鍵!這里邀月折騰了整整一天!)


           

          新建一個(gè)Java project,命名為GetWCFInfoByJavaClient,并在新項(xiàng)目中添加新向?qū)В現(xiàn)ile-New

          此時(shí),我們可以看到期待已久的wizard界面:
          邀月工作室

          邀月工作室

          邀月工作室

          邀月工作室

          邀月工作室

          邀月工作室

          此進(jìn),在新建的 GetWCFInfoByJavaClient 項(xiàng)目中建一個(gè)package,命名為org.tempuri,與前面自定義的命名空間一致。將生成的兩個(gè)類(lèi)文 件,ServiceCallbackHandler.java和ServiceStub.java文件添加進(jìn)來(lái),并在jreSE1.6庫(kù)中添加 d:\2000\Java\Axis2\lib下所有jar文件的引用。

          注意此時(shí)有個(gè)特殊的文件,即Axis2_Codegen_Wizard_1.4.1\lib\axis2-1.4.1.jar,需要手動(dòng)復(fù)制到d:\2000\java\axis2\lib下并添加到項(xiàng)目的jre庫(kù)中,這是邀月第二個(gè)卡殼的地方,琢磨了好久,慎之慎之。

          項(xiàng)目的結(jié)構(gòu)應(yīng)該如下圖:
          邀月工作室
           

          eclipse的命名空間提示就是比vs強(qiáng)啊!很喜歡Ctrl+1。呵呵。微軟要是能做到這點(diǎn),那該多好啊!

          要命的是,此時(shí)庫(kù)都添加完成,檢查代碼也無(wú)誤,居然編譯錯(cuò)誤,提示:

          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老是無(wú)故罷工,真是禍不單行,終于找到一篇老外的文章,說(shuō)是如下,即可解決:
              * 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

          邀月工作室


          邀月工作室

          邀月工作室

          終于編譯成功!看到曙光了,

          邀月工作室

          此時(shí),最后的工作就是在Main中調(diào)用stub得到我們想要的服務(wù)結(jié)果了,簡(jiǎn)單方法,將剛才生成的測(cè)試類(lèi)的方法略作修改,即可運(yùn)行。如下:
          邀月工作室

          這正是我們想要的結(jié)果。


          關(guān)于java與.net交互的其他文章,請(qǐng)參考:

          微軟示例:

          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)建獨(dú)立 Web Services 應(yīng)用程序,第 1 部分: Web Services 服務(wù)端應(yīng)用程序(該鏈接需要先注冊(cè))

          https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-eclipse-javase1/section2.html


          小結(jié):這雖然只是一個(gè)簡(jiǎn)單的demo,但我問(wèn)了許多人,并在論壇發(fā)問(wèn),可是由于使用環(huán)境的不同,最終沒(méi)找到類(lèi)似的環(huán)境,只好自己摸索實(shí)踐,好在還有一點(diǎn)點(diǎn)java基礎(chǔ),另外網(wǎng)上幾個(gè)論壇像javaeye提供的答案過(guò)于陳舊,這正是java初學(xué)者苦惱之處,這點(diǎn)來(lái)看,微軟的開(kāi)發(fā)環(huán)境無(wú)論如何是值得稱(chēng)贊的,至少它不用跑到別的地盤(pán)去問(wèn)答案。eclipse\tomcat\axis等代表的服務(wù)器和開(kāi)發(fā)環(huán)境、插件配置非常的讓初學(xué)者無(wú)奈!因?yàn)槟悴恢滥硞€(gè)jar是否與其他幾千個(gè)jar很好的兼容。不知道java高手們是否指一條明道,非常感謝!并再次感謝yycxb

          下篇文章介紹WCF客戶端如何調(diào)用java的web service,那要簡(jiǎn)單多了。敬請(qǐng)關(guān)注。

           

          Java與WCF交互(二):WCF客戶端調(diào)用Java web service

          Java與WCF交互(一)補(bǔ)充:用WSImport生成WSDL的Java客戶端代碼




          邀月注:本文版權(quán)由邀月和博客園(BlogJava)共同所有,轉(zhuǎn)載請(qǐng)注明出處。
          助人等于自助!   3w@live.cn

          評(píng)論

          # re: Java與WCF交互(一):Java客戶端調(diào)用WCF服務(wù)  回復(fù)  更多評(píng)論   

          2010-08-24 16:02 by 忘憂結(jié)
          博主用的截圖軟件很不錯(cuò)啊,能透露下軟件名字嗎?

          # re: Java與WCF交互(一):Java客戶端調(diào)用WCF服務(wù)  回復(fù)  更多評(píng)論   

          2010-08-24 16:13 by 邀月
          @忘憂結(jié)
          呵呵。snagit
          主站蜘蛛池模板: 日土县| 德清县| 广安市| 渑池县| 唐海县| 东城区| 肇州县| 普定县| 余干县| 高青县| 南漳县| 会理县| 方山县| 赤峰市| 同心县| 皋兰县| 宾阳县| 龙口市| 鄂伦春自治旗| 吴旗县| 香河县| 乐都县| 涟源市| 梨树县| 宜兰县| 华容县| 庆安县| 卢龙县| 江山市| 黄平县| 北京市| 崇仁县| 彭州市| 余干县| 云浮市| 兴宁市| 石阡县| 宜宾县| 赤水市| 苍梧县| 广州市|