2011-02-09 57 views
2

我使用eclipse axis2從wsdl創建Web服務客戶端。作爲服務器請求檢索axis2 web服務中的jsf bean

我IMPL方法是:

public Output[] startProcess(Message[] Messages){ 
    MyApplicationBean managementBean = (MyApplicationBean) FacesContext.getCurrentInstance().getExternalContext().getApplicationMap().get("myapp"); 
... 
} 

然而,當我執行:

http://localhost:8080/MyProject/services/portStartProcessService與方法startProcess

我在tomcat的調試看到它達到我的方法,但是FacesContext.getCurrentInstance()返回null。

我的web.xml文件(的一部分)

<servlet-mapping> 
    <servlet-name>Faces Servlet</servlet-name> 
    <url-pattern>*.jsf</url-pattern> 
    <url-pattern>/services/*</url-pattern> 
    </servlet-mapping> 
<servlet-mapping> 
    <servlet-name>AxisServlet</servlet-name> 
    <url-pattern>/servlet/AxisServlet</url-pattern> 
    </servlet-mapping> 

如何使用JSF豆類(如應用範圍)的Web服務調用?

回答

2

我知道你不想聽到這個,但你的架構錯了。 JSF應用程序上下文是沒用的與Web服務調用,因爲JSF的整體思路是,GUI內置存儲狀態組件:

  • 在用戶會話,或者:
  • 在一個隱藏的表單字段

既然會話和表單都不可用於Web服務調用,那麼JSF在這裏不適用。你可能會問如何製作一個按下JButton的Web服務或將CD插入CD-ROM。

我知道你不需要JSF組件,而是需要一些駐留在託管bean內的應用程序邏輯,對嗎?

那麼,最簡​​單的解決方案是得到一個時間機器,回到項目計劃的時間,並告訴架構師,你永遠不要把應用程序邏輯納入管理豆類。其中一個原因是它們無法用於Web服務調用。您的應用程序邏輯應該位於由Spring或EJB提供的服務層中。

Spring bean和EJB都可以很容易地從Axis服務和託管bean中獲取,因此您從不需要從JSF前端以外的任何位置訪問JSF託管的bean。如果你不喜歡Spring並且由於某種原因不能使用EJB,那麼從POJO構建服務層,在ApplicationContextListener中設置它並註冊到應用程序範圍中。

如果這樣乾淨的解決方案是不可用和重構是不可能的,你有兩個選擇:

  • 如果你試圖達成託管豆應用作用域和渴望,那麼他們可以在JSP的方式進行訪問從應用程序上下文中,使用可敬的getAttribute方法(您可以通過servlet上下文訪問應用程序上下文,您可以通過消息上下文訪問該上下文,這又可以通過Axis中的靜態MessageContext.getCurrentMessageContext方法訪問)。

  • 如果您要使用的託管bean是請求作用域並需要一些JSF管道(因此您無法自行實例化它們),那麼您可以假裝爲FacesServlet並自己創建faces上下文;這是棘手的,但可行的,一個很好,很有名的描述在這裏:http://www.thoughtsabout.net/blog/archives/000033.html。您需要將需要servletrequest和servletresponse(來自MessageContext)。您可以跳過傳遞FacesContext所需的部分,因爲您不需要它來處理任何視圖。

聲明:我從來沒有嘗試過的最後一個解決方案 - 它似乎工作,雖然這是很骯髒的(實際上使你的網絡服務依賴於JSF,這是的bizzare)。

+0

非常好的答案。事實上 - 如果你想替換JSF應用程序範圍bean,你如何在春天定義一個像這樣的服務器啓動它會調用一個方法? – Dejell 2011-02-09 18:39:29