2010-01-26 67 views
5

我有一個由wsgen通過maven生成的web服務。當我將服務部署到Glassfish時,它將服務器URL放入WSDL中。我們的Glassfish服務器由Apache代理服務器提供服務。忽略Glassfish生成的WSDL服務端點地址

這一切都說明,當有人訪問我們的WSDL和着眼於服務端點和他們看到的肥皂地址是

http://app server url/service... 

,而不是

http://proxy server url/service... 

是我想我需要一些澄清在幾件物品上...

  1. 這個端點地址重要嗎?如果端點地址與他們將調用以調用服務的代理服務器的URL不匹配,客戶端是否仍能夠運行。這基本上提出了問題「是WSDL到web服務,因爲接口是對象」。

    UPDATE:響應於但看來「WSDL到Web服務作爲接口是到對象」這個第一個問題。 WSDL中指定的端點地址並不重要。事實上,在不同於WSDL as described here中指定的端點上調用Web服務操作相對簡單。

     
    // Create service and proxy from the generated Service class. 
    HelloService service = new HelloService(); 
    HelloPort proxy = service.getHelloPort(); 
    
     
    // Override the endpoint address 
    ((BindingProvider)proxy).getRequestContext().put(
         BindingProvider.ENDPOINT_ADDRESS_PROPERTY, 
         " http://new/endpointaddress "); 
    proxy.sayHello("Hello World!"); 
    

  2. 當我們部署到Glassfish時,會自動生成WSDL。是否有一種簡單的方法可以通過應用程序服務器設置覆蓋Glassfish中生成的端點地址。如果是這樣,我可以創建一個設置來自動將代理服務器URL放入生成的WSDL中。

如果1的確很重要,我們不能用2以任何方式覆蓋它,那麼它基本上意味着我們需要爲開發和生產做單獨的構建。這並不是「感覺不錯」,因爲在我看來,我們需要做的部署到另一臺服務器的唯一一件事就是將現有的(並經過測試的)戰爭從一個環境放到新的服務器上。

回答

4

事實證明HTTP Listener上有一個Server Name參數,其中部署了該服務。您可以從Glassfish管理控制檯指定此值,Glassfish將使用此名稱而不是請求URL中的主機名。

不幸的是,如果你的應用服務器和代理服務器不使用相同的(我們不這樣做),這個參數將不允許你覆蓋端口或協議(http到https)。

我做的是我的服務write a simple servlet filter爲我處理這個。

3

我發現我認爲是一種處理這個問題的非常簡單的方法:在Apache中使用mod_substitute。由於我們這些問題已經在使用Apache,而且它內置簡單,所以我最喜歡這種方法。

我把類似下面的方框中的我的Apache conf文件之一,並找到快樂:

<Location /> 
    AddOutputFilterByType SUBSTITUTE text/xml 
    Substitute "s|http://internal:8080/xxx|https://external/xxx|ni" 
</Location>