2014-02-24 68 views
2

我正在學習如何使用Java實現Web服務。按照O'Reilly的書「學習Java」中的例子,我下載了一個WSDL文件(見http://bit.ly/13moiTh),用於cdyne.com的天氣服務,並使用wsimport工具生成了一組類。Java Web服務客戶端無法從cdyne.com訪問天氣服務

的第一個問題是,當我生成一個JAR文件,在Eclipse項目中引用它,類無法識別。我必須使用wsimport -keep並單獨將所有源文件複製到項目中以使其生成。

接下來,以確保該服務可用,我構建了一個基於從書的代碼簡單的HTTP POST客戶端。我可以使用該代碼成功訪問getCityWeatherByZIP服務,因此沒有連接或身份驗證問題。

最後,我嘗試使用自動生成的Web服務客戶端代碼訪問getCityWeatherByZIP和getCityForecastByZIP服務。無論默默地失敗,即isSuccess()方法返回false和所有響應領域是空:

Weather service = new Weather(); 
WeatherSoap weatherSoap = service.getWeatherSoap(); 
WeatherReturn weather = weatherSoap.getCityWeatherByZIP(ZIP); 
if (weather.isSuccess()) {  
    System.out.format("%s, %s : %s : Temperature: %s, Wind: %s\n", 
      weather.getCity(), weather.getState(), weather.getDescription(), 
      weather.getTemperature(), weather.getWind()); 
} 
else { 
    System.out.println("Failed to obtain weather"); 
} 

在單步調試代碼,在getCityWeatherByZIP(),我發現了以下NoSuchMethodException: com.sun.xml.internal .ws.api.message.Packet.setHeaderList(com.sun.xml.internal.ws.api.message.HeaderList)「

此異常發生在(在Eclipse的Debug透視圖中)行中: 」 SEIStub.invoke(對象,方法,對象[])行:不可用」

顯然,Packet.setHe aderList(HeaderList)方法不存在,這也是由非內部類的文檔佐證: https://jax-ws.java.net/nonav/jax-ws-20-fcs/arch/com/sun/xml/ws/api/message/Packet.html

我使用的是最新的JDK 1.7和Eclipse版本:開普勒服務發佈1,建立ID:20130919- 0819。

我不知道如何解決這個問題。任何幫助,將不勝感激。

+1

我解決了這個問題:Eclipse項目中缺少package-info.java文件。一旦我按照這些說明將它添加到包中,一切都開始起作用了: http://stackoverflow.com/questions/8405336/how-do-i-use-or-edit-package-info-java – user1408140

回答

0

除了從書的源代碼,還需要以編譯和運行JAX-WS Web服務代碼的副本。您更新了Eclipse內部的構建路徑以引用JAX-WS Web服務的任何JAR,聽起來Eclipse似乎沒有類路徑上的副本。

JAX-WS是規範,但你需要爲了運行,可能是參考實現實際的實現JAX-WS的?

+0

好吧,我還有一本非常簡單的Web服務實現,使用本書另一個示例中的WebService和WebMethod註釋,它看起來運行良好。沒有做任何特別的事情,我可以在Eclipse中啓動程序,然後使用瀏覽器訪問正在運行的服務器,例如獲取自動生成的WSDL文件。我上面描述的客戶端代碼編譯並運行時沒有任何可見的異常(我只能看到異常時通過代碼);但是,WeatherReturn和ForecastReturn實例只是空的。所以,我不知道該怎麼做。 – user1408140

+0

你見過這個頁面 - http://wiki.cdyne.com/index.php/CDYNE_Weather#Example_Source_Code來自他們的維基 - 看起來它有一些在頁面底部的鏈接,以一些不同語言的樣本。 – mikemil

+0

謝謝,但這並不能解決問題。本書的代碼非常簡單,使用由cdyne的WSDL中的wsimport自動生成的類提供的API。 順便說一句,這表示JDK 1.7包含JAX-WS 2.2: http://docs.oracle.com/javase/7/docs/technotes/guides/xml/jax-ws/它解釋了爲什麼我可以編譯和運行客戶端和服務器沒有任何特殊的Eclipse或命令行。 – user1408140