2011-05-09 76 views
5

我有一個幾年前在C++中創建的Web服務,並且由.NET客戶端使用C#的「wsdl.exe」生成客戶端存根。出於各種原因,我現在還需要一個Java客戶端,並且願意使用JAX-WS將使用限制在Java 6(JDK 1.6)中。生成的存根工作正常,即使打包在一個.jar中,但我對JAX-WS Web服務客戶端希望部署的方式有問題。它看起來像我有的問題是可解決,但沒有任何建議的方式似乎工作。將Web服務的WSDL嵌入到JAX-WS客戶端.jar

JAX-WS希望WSDL可以訪問,最好是從網絡訪問,因爲它每次啓動時都會解析WSDL以創建綁定。像Creating a web-service client with a known but inaccessible wsdl中的jgrowl一樣,客戶端可能無法訪問JAX-WS使用的URL(可能是構建機器上的文件或指向本地主機的指針)的WSDL。我想將WSDL發佈到客戶端.jar中,但最簡單的解決方案(-wsdllocation "/path/to/wsdl/in/jar.wsdl")會打印出我不想顯示的警告。

我也更喜歡不是讓客戶端做類似解決方案jgrowl發現,似乎工作,但不只是工作。在Google上發現的文章主要針對服務器WSDL位置,但建議客戶端應該能夠使用META-INF/jax-ws-catalog.xml文件將-wsdllocation中使用的URL轉換爲.jar文件中的路徑,但這些文件在我們的測試中似乎不起作用。

是否有「祕方」,讓我可以把WSDL中的.jar內的某處,有一個JAX-WS客戶只是工作與客戶端的用戶,並在沒有警告的部分沒有額外的努力?

回答

3

如果您不想在構造函數中將URL設置爲WSDL,您可能可以依賴生成的構件的行爲。當I use以下-wsdlLocation

-wsdllocation wsdl/MaintainAddress.wsdl 

在服務代碼生成的靜態初始化以下內容:

static { 
    URL url = null; 
    try { 
     URL baseUrl; 
     baseUrl = demo.ws.service.MaintainAddress_Service.class.getResource("."); 
     url = new URL(baseUrl, "wsdl/MaintainAddress.wsdl"); 
    } catch (MalformedURLException e) { 
     logger.warning("Failed to create URL for the wsdl Location: 'wsdl/MaintainAddress.wsdl', retrying as a local file"); 
     logger.warning(e.getMessage()); 
    } 
    MAINTAINADDRESS_WSDL_LOCATION = url; 
} 

這將基本上做同樣的事情,你找到了解決辦法,但默認構造函數。 WSDL需要成爲wsdl文件夾中類路徑上的資源。

這種方法對我沒有任何警告。

我不認爲這種行爲在the spec中定義 - 至少,我一直沒有找到它。我相信這是我JDK中的wsimport工具的實現細節。


您有更多的選擇,如果你部署到Java EE容器 - 見JSR 109。我相信這是jax-ws-catalog.xml發揮作用。

+0

不幸的是,執行'-wsdlLocation wsdl/MaintainAddress.wsdl'會導致警告 - 至少當我在星期五嘗試時。也就是說,看起來''jax-ws-catalog.xml'東西今天起作用。 讓我感到困惑。 – 2011-05-09 18:20:11

+0

你能用jax-ws-catalog.xml解決方案更新/回答你的問題嗎?我想在可預見的將來遇到同樣的問題......謝謝! – 2011-05-09 19:43:34

+0

@奧斯汀齊格勒 - 如果你陳述警告信息是什麼,它可能會有所幫助。 – McDowell 2011-05-09 19:53:14