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

最近開始瞭解WCF,寫了個最簡單的Helloworld,想經過java客戶端實現通訊。沒想到以個人基礎,竟然花了整整兩天(固然是工做之外的時間,呵呵),整個過程大費周折,特寫下此文,以供有須要的朋友參考:html

第一步:生成WCF服務java

新建WCF解決方案,分別添加三個項目,HelloTimeService(類庫),HelloTimehost(控制檯程序),HelloTimeClient(控制檯程序),項目結構如圖:
邀月工做室
各個項目的主要代碼:
service:
邀月工做室ios

Host:
邀月工做室web

Client:
邀月工做室apache

編譯經過後,測試Host和Client分別成功:
邀月工做室api

邀月工做室

保持Host程序打開,這樣,WCF服務就一直能夠被外部程序調用。固然也包括Java客戶端。tomcat

咱們看看生成的WSDL服務器

邀月工做室

邀月工做室

第二步:調用WCF生成的WSDL生成java客戶端。eclipse

首先,請容許我介紹下axis2,它的官方地址:http://ws.apache.org/axis2/ide

這是一個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的配置文件:

複製代碼
<?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

相關文章
相關標籤/搜索