2012-08-24 72 views
0

我正在使用自頂向下的方法處理Web服務,使用JAX-WS'wsimport從WSDL生成服務類型和接口。這提供了一個端口類型的接口,如下所示,我執行。以編程方式獲取JAX-WS WebService實現的Servlet實例?

/** 
* This class was generated by the JAX-WS RI. 
* JAX-WS RI 2.2.4-b01 
* Generated source version: 2.2 
*/ 
@WebService(name = "ExamplePortType", targetNamespace = "http://example.com") 
public interface ExamplePortType { 

    /** 
    * @param example 
    * @return java.lang.String 
    * @throws ExampleException 
    */ 
    @WebMethod 
    @WebResult(name = "exampleResponse", targetNamespace = "http://example.com") 
    @RequestWrapper(localName = "sendExample", targetNamespace = "http://example.com", className = "com.example.SendExample") 
    @ResponseWrapper(localName = "sendExampleResponse", targetNamespace = "http://example.com", className = "com.example.SendExampleResponse") 
    public String sendExample(
     @WebParam(name = "example", targetNamespace = "http://example.com") 
     ExampleRequest example) 
     throws ExampleException 
    ; 
} 

好像這個服務添加到您的應用程序服務器的正常方式(在我的情況下,Tomcat),是實現類添加到web.xml的servlet和添加WSServletContextListener作爲一個傾聽者。非常粗略的看起來,在初始化上下文時,監聽器會構造包裝實現bean的ServletAdapter,並將它們添加到由WSServlet調用的WSServletDelegate。然後由WSServlet處理對您的實現的請求,並由代理根據您設置的任何URL模式傳遞給您的bean。

有沒有辦法做到以上編程?我想要一個接受上述接口的實例並返回給我一個Servlet的實例的方法,如果在ServletContext中註冊的話,會將相應的請求路由到包裝的實現。喜歡的東西:

Servlet exampleServlet = new ServletAdapter().wrap(new ExamplePortTypeImpl()); 

的一個要求是,我不能依靠靜態配置文件(如web.xml中或陽光jaxws.xml)。 JAX-WS或相關庫(即:Axis2等)是否提供這種功能?

道歉,如果有什麼不明確;這是我第一次來:)。任何指針讚賞。

當前使用JAX-WS 2.1,Tomcat 7,Servlet 3.0。

回答

1

好的,經過大量的實驗,我已經能夠將一些有用的東西放在一起。爲了文檔的緣故,我會在這裏發佈它。

基本上,我通過模擬或重新實現JAX-WS如何從它的WSServletContextListener創建它的WSServlet來實現此目的。不幸的是,我無法找到一個更容易或更好的支持和直接的方式來做到這一點。

基本上,我的工廠使用它的WSEndpoint.create()方法創建一個WSEndpoint。 create()將我試圖包裝的WebService實現的Class作爲輸入。大多數其他輸入爲空以鼓勵WSEndpoint使用默認值或嘗試從實現類中的註釋中提取一些配置。

然後,我使用新的ServletAdapterList()使用先前創建的WSEndpoint創建ServletAdapter。爲此,由於我爲每個實現類創建了一個Servlet,因此適配器的名稱無關緊要,並且可以將其配置爲將所有流量發送到實現,而不管URL如何。

然後,我使用先前的ServletAdapter的單例列表創建一個新的WSServletDelegate()。這裏唯一的技巧是,看起來JAX-WS至少對於這一步和下一步都有一個不好的習慣,即在ServletContext的初始參數中存儲一些值。它也沒有正確地檢查空值,儘管如果參數不在上下文中它有默認值使用。所以我最終創建了一個ServletContext的虛擬實現,我將它傳遞給WSServletDelegate構造函數,使其感覺像是在查找init參數。

最後,我創建了一個HttpServlet的實現,它將請求轉發到WSServletDelegate,類似於WSServlet的做法。由於WSServlet再次將委託對象存儲在ServletContext初始參數中,我發現重新實現它的功能比混淆現有的WSServlet更容易。這個HttpServlet的實現可以像任何普通的Servlet一樣對待,它將接受並處理SOAP web服務調用。

相關問題