2012-06-19 51 views
3

我是JSF的新手,並且遇到問題。我希望有人能幫助我。如何從不是JSF Bean的類創建FacesMessage?

問題:

  • 處理程序不是一個bean從TCP/IP管檢測到的消息。
  • 處理程序需要創建一個新的FacesMessage以在消息框中顯示消息。
  • 由於處理程序不是一個bean,FacesContext返回null,因此處理程序不能寫入FacesMessage

問題:

  1. 是它在某種程度上可以做什麼,我試圖做的?
  2. 將外部消息從不是bean的Java類傳播到FacesMessage以便它顯示在UI上的最佳方式是什麼?

有關如何解決此問題的任何想法?

回答

3

如果您處於實際面孔會話中,FacesContext.getCurrentInstance()方法僅返回有效的面孔上下文。我認爲你應該考慮的是設計這樣的一個方法,使得你的類執行TCP/IP消息處理提供了一種方法,使面向託管bean獲得有關到前端的消息的信息,然後從託管的bean。

根據您使用的應用程序服務器的類型,您可能希望將這整個事件設置爲通過EJB會話bean進行交互。但是真正的任何支持bean或faces邏輯應該完全獨立於與您的UI無關的邏輯。

如果您使用的是JEE6兼容的應用程序服務器(如Glassfish),您可以設置一個@Singleton EJB來保存一組消息(確保使用支持併發的數據結構)以及類似JCA-sockets (http://code.google.com/p/jca-sockets/)來處理套接字通信。

+0

是的......我想使用一個Singleton bean,然後對該Bean進行JNDI查找並調用addMessage,後者又使用FacesContext,但該Bean也爲FacesContext返回null? – jrobertsz66

+0

單身bean與JSF輔助bean不同。雖然他們都稱爲豆類,但它們並不完全相同。 EJB/JEE層與JSF的視圖層是分開的。你最終要做的是將你的singleton注入到一個後臺bean中(你可以使用描述符Rachel來描述設置後臺bean,或者你可以使用註釋來設置它) – hsanders

+0

好吧,我不認爲這是去工作,這是爲什麼:1 - 我的處理程序代碼是檢測事件,它不是一個bean。2 - 我的處理程序代碼是需要以某種方式將消息傳播到UI的程序代碼。 3 - 我的處理程序代碼當時沒有訪問bean的權限。所以,在這種情況下沒有bean注入到另一個bean中,因爲沒有處理請求。上面第1步中的處理程序代碼只是一個檢測和事件的線程。 – jrobertsz66

1

不,這是不可能的,另一種方法是無論是@ManagedBean註釋或具有類似

<managed-bean> 
    <managed-bean-name>bean</managed-bean-name> 
    <managed-bean-class>com.test.bean</managed-bean-class> 
    <managed-bean-scope>session</managed-bean-scope> 
</managed-bean> 

faces-config.xml中的條目來創建後臺bean,現在你可以得到facesContext創造FacesMessage都, 希望這可以幫助。

+0

嗯,我的問題是我的處理程序不能是一個bean,所以我沒有選擇將它轉換爲一個bean,所以我可以做到這一點。是否有任何其他方式顯示從外部Java類到JSF UI的消息? – jrobertsz66

相關問題