1. 程式人生 > >Java與WCF互動(一 Java客戶端呼叫WCF服務

Java與WCF互動(一 Java客戶端呼叫WCF服務

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

 

最近開始瞭解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 服務端應用程式(該連結需要先註冊)

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的配置檔案:

[xhtml] view plain copy print ?
  1. <?xml version="1.0" encoding="utf-8" ?>  
  2. <configuration>  
  3.   <system.web>  
  4.     <compilation debug="true" />  
  5.   </system.web>  
  6.   <system.serviceModel>  
  7.     <services>  
  8.       <service name="Sample.WCF.HelloTimeForJava.Service" behaviorConfiguration="MyServiceTypeBehaviors">  
  9.         <endpoint address="HelloTimeService" binding="wsHttpBinding" contract="Sample.WCF.HelloTimeForJava.IService">  
  10.           <identity>  
  11.             <dns value="localhost" />  
  12.           </identity>  
  13.         </endpoint>  
  14.         <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />  
  15.         <host>  
  16.           <baseAddresses>  
  17.             <add baseAddress="http://localhost:8000/" />  
  18.           </baseAddresses>  
  19.         </host>  
  20.       </service>  
  21.     </services>  
  22.     <behaviors>  
  23.       <serviceBehaviors>  
  24.         <behavior name="MyServiceTypeBehaviors">  
  25.           <serviceMetadata httpGetEnabled="True" httpGetUrl=""/>  
  26.           <serviceDebug includeExceptionDetailInFaults="False" />  
  27.         </behavior>  
  28.       </serviceBehaviors>  
  29.     </behaviors>  
  30.   </system.serviceModel>  
  31. </configuration>  
<?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互動(一)補充:用WSImport生成WSDL的Java客戶端程式碼
邀月注:本文版權由邀月和CSDN共同所有,轉載請註明出處。
助人等於自助!   [email protected]
   
  

 

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述