天天看點

Java與WCF互動(一):Java用戶端調用WCF服務

最近開始了解WCF,寫了個最簡單的Helloworld,想通過java用戶端實作通信。沒想到以我的基礎,居然花了整整兩天(當然是工作以外的時間,呵呵),整個過程大費周折,特寫下此文,以供有需要的朋友參考:

第一步:生成WCF服務

建立WCF解決方案,分别添加三個項目,HelloTimeService(類庫),HelloTimehost(控制台程式),HelloTimeClient(控制台程式) 

編譯通過後,測試Host和Client分别成功:

Java與WCF互動(一):Java用戶端調用WCF服務
Java與WCF互動(一):Java用戶端調用WCF服務

保持Host程式打開,這樣,WCF服務就一直可以被外部程式調用。當然也包括Java用戶端。

我們看看生成的WSDL

Java與WCF互動(一):Java用戶端調用WCF服務

第二步:調用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的插件。而且是在參考了衆多解決方案才配置成功!

 ​

我的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">

将Axis2_Codegen_Wizard_1.3.0重命名為Axis2_Codegen_Wizard_1.4.1,(這是整個部署的關鍵!這裡邀月折騰了整整一天!)

建立一個Java project,命名為GetWCFInfoByJavaClient,并在新項目中添加新向導,File-New

此時,我們可以看到期待已久的wizard界面:

Java與WCF互動(一):Java用戶端調用WCF服務
Java與WCF互動(一):Java用戶端調用WCF服務
Java與WCF互動(一):Java用戶端調用WCF服務
Java與WCF互動(一):Java用戶端調用WCF服務

此進,在建立的 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

Java與WCF互動(一):Java用戶端調用WCF服務

這下我傻眼了,于是趕緊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

Java與WCF互動(一):Java用戶端調用WCF服務

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

Java與WCF互動(一):Java用戶端調用WCF服務

此時,最後的工作就是在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 服務端應用程式(該連結需要先注冊)

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

小結:這雖然隻是一個簡單的demo,但我問了許多人,并在論壇發問,可是由于使用環境的不同,最終沒找到類似的環境,隻好自己摸索實踐,好在還有一點點java基礎,另外網上幾個論壇像javaeye提供的答案過于陳舊,這正是java初學者苦惱之處,這點來看,微軟的開發環境無論如何是值得稱贊的,至少它不用跑到别的地盤去問答案。eclipse\tomcat\axis等代表的伺服器和開發環境、插件配置非常的讓初學者無奈!因為你不知道某個jar是否與其他幾千個jar很好的相容。不知道java高手們是否指一條明道,非常感謝!并再次感謝​​yycxb​​

下篇文章介紹WCF用戶端如何調用java的web service,那要簡單多了。敬請關注。

 附:WCF的配置檔案:

Java與WCF互動(一):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互動(一):Java用戶端調用WCF服務