2011-05-04 111 views
3

我在整個Web上都看到過這個問題,但仍未找到適用於我的明確解決方案。這裏的問題:在Java中創建Web服務客戶端時的錯誤

我想在Java中創建一個Web服務客戶端。客戶端需要是一個控制檯應用程序,它將放置在服務器上,並以特定的時間間隔自動運行。我試圖使用的Web服務是由第三方公司主持編寫的。該服務是用ASP.NET編寫的。有問題的公司有我們碰到的幾項服務。所有這些都是用ASP.NET編寫的。直到兩天前,我才從事這些服務的處理,當時我負責消費2項服務並從數據中構建Excel電子表格。在繼續之前,讓我描述一下我的開發環境。一些這方面是相關的,有些是沒有,但我想包括一切:

  • Windows 7專業版32位
  • NetBeans IDE的6.9.1
  • 的Java JDK 1.6.0_17
  • JRE6
  • Glassfish的3開源全平臺發行
  • 所有軟件已經有了所有可用的更新應用

解決問題。當我將第一個Web服務客戶端添加到我的控制檯應用程序時,我對這個過程的順利進行感到驚訝。我寫Web服務應用程序的大部分經驗都在.NET中。我能夠在第一次嘗試時導入WSDL和NetBeans生成的所有類。在5分鐘內,我能夠打電話給我的第一個服務,並得到了預期的響應,讓我知道我的嘗試是成功的。然後,我使用第二個WSDL所需的地址將第二個Web Service Client添加到控制檯應用程序。這是我遇到的一個主要問題。

在導入WSDL,我被NetBeans的聲明提醒的錯誤:

Web服務客戶端無法通過JAXWS創建:wsimport的實用工具。
原因:未定義元素聲明的:模式'

濫用谷歌下一個小時的尋找解決的辦法,我終於決定申請一些試驗和錯誤。查看NetBeans中的Output窗口,我可以看到它抱怨了3條特定的行。有一次,我在WSDL接過一看,我可以看到那些3線都是一模一樣的,如下:

<s:element ref="s:schema" /> 

這3條線路在隨機的地方被發現從WSDL的頂部,下降到約一半通過。我從Web服務引用文件夾中找到的WSDL中刪除了這些行,將WSDL保留在META-INF文件夾中。然後我對服務參考進行了刷新,讓我感到意外的是,NetBeans解析了WSDL並像以前一樣生成了我的類。很好,對吧?那麼,這裏是#2問題的起因。

既然我能夠編譯我的應用程序沒有錯誤,我不得不嘗試擊中服務,看看我的黑客是否工作。它沒。由於JAXWS中存在另一個錯誤,在創建服務對象時,我必須在構造函數中爲WSDL提供URL。這意味着我修正的WSDL被忽略,服務現在回到使用無法解析的WSDL。當我試圖提供我在項目中本地編輯的WSDL的位置時,遇到另一個編譯錯誤,指出我有一個NullPointerException。它說我需要在使用它之前初始化對象。

我研究了本網站上尋找和嘗試提供任何解決方案的無限量主題。我也嘗試過來自全網的解決方案,所有這些都沒有運氣。如果有人對我有任何建議,任何提示,技巧,黑客,請讓我知道。我願意接受任何建議。

在此先感謝您提供的任何幫助。

+0

這可能是相關的:http://weblogs.java.net/blog/vivekp/archive/2007/05/how_to_deal_wit_1.html – 2011-05-04 20:23:48

回答

0

單向契約更改可能會導致問題。

假設s前綴引用http://www.w3.org/2001/XMLSchema命名空間,它看起來像您的WSDL引用XML模式類型。生成JAXB綁定時,JAX-WS可能無法解決此問題。

您可以從http://www.w3.org/2001/XMLSchema.html下載XSD;至少,您需要XMLSchema.xsd,XMLSchema.dtddatatypes.dtd。從中生成Java類型可能需要處理JAXB綁定配置。

或者,僅使用dynamic JAX-WS client code可能更容易。您可以使用像soapUI這樣的工具來創建/測試示例XML請求。


如果你決定編輯WSDL,生成的服務代碼的形式應該爲Foo_Service(URL, QName),使您可以提供的WSDL局部(例如,從你的classpath)的構造函數。

0

我要做的第一件事就是嘗試在用於測試SOAP服務的其中一個工具中打開它,如SoapUI。如果你的schema沒有解析,那麼可能會有一些你可能需要的代碼不會被生成。我最近在一家供應商提供「網絡服務」時發生過這種情況,經過大量拆解後,他們「奇蹟般地」發現了一套可以正常工作的替代服務。

您也可以嘗試一些Jax-W的替代品,如CXF或Axis。