2017-08-03 291 views
2

我一直在試圖解決一個問題,我的managedBean有時是空的(我得到了目標不可達錯誤消息,說bean是空的),這個間歇性問題通常發生在我修補程序在@PostConstruct方法中。如果@PostConstruct失敗,Bean會被創建

在啓動應用程序時,我確實沒有看到任何錯誤,但只要我嘗試通過XHTML與BOOM進行交互,BOOM! Bean是空的。我閱讀了@PostConstruct文檔,它說如果發生異常,「這個bean沒有投入使用」,這是否意味着JSF不會創建/處理這個bean。一個失敗的@postConstruct是我的空bean的原因(基於我提到的)?如果說@PostConstruct出於某種原因而失敗,爲什麼我沒有在服務器日誌中看到異常(是否應該優雅地失敗)?

對不起,這是理論性的,但它是唯一對我有意義的事情,並且顯示代碼真的不會幫助,因爲根本原因很難。

另一個問題 - 如何在@PostConstruct中捕獲/調試任何問題?

感謝您的時間,對不起如果我沒有按照一些Q & Stackoverflow準則。

+0

@IrfanBhindawala你應該仔細閱讀我的答案,因爲我提供了證明我的觀點的文檔鏈接。你檢查出來了嗎? –

+0

@TolegenIzbassar,我很抱歉從我身邊的誤解,因爲我已經看到,問題中有標籤'春',然後我通過第一個標籤得到了錯誤的方向。對不起! –

+0

謝謝你們!我從來沒有搞清楚這個,文件非常脆弱,有時甚至使用String .equals會導致一個空bean。謝謝你的時間! – Joe

回答

3

如果您有JSF @ManagedBean,則缺省情況下該bean的實例化是惰性的。這意味着只有當請求會來時纔會創建bean。這就是爲什麼在啓動應用程序時看不到錯誤。 managedBean註釋具有名稱爲eager的屬性,您可以將其設置爲true,但它將在應用程序僅啓動applicationScope beans時起作用,如在documentation中所述。

創作的生命週期通常遵循以下步驟: 調用默認的構造函數創建bean - >佈線所需的所有管理特性和 環境 - >調用@PostConstruct方法 - >如果這一切是 全成那個時候的豆準備爲請求提供服務。

通常情況下,所有管理bean的容器都告訴有一個步驟沒有正常工作時發生的問題。爲了調試,您可以嘗試捕獲postConstruct方法中的任何異常。另一種選擇是讓你development階段JSF應用程序,它通過設置在web.xml文件屬性爲facesServlet這樣做:

<context-param> 
    <param-name>javax.faces.PROJECT_STAGE</param-name> 
    <param-value>Development</param-value> 
</context-param> 

這會給你在錯誤的情況下更多的調試信息。您應該閱讀JSF提供商提供的有關獲取錯誤信息的文檔,因爲它可能會有所不同,或者需要諮詢JSF規範本身。

但是,只要你在日誌中沒有任何東西,我認爲在配置中或者頁面本身可能存在一些錯誤。爲了確定你應該提供更多關於你確切問題的信息。

+0

「默認情況下,bean的實例化是懶惰的,這意味着只有在請求會出現時纔會創建bean,這就是爲什麼在引導應用程序時看不到錯誤」 - 這是錯誤的。默認情況下Spring bean的行爲是singleton,容器在啓動時實例化這個bean(默認行爲)。有關更多信息,您可以[點擊此處](http://docs.spring.io/spring/docs/current/spring-framework-reference/ htmlsingle /#beans-dependency-resolution) –

+0

@IrfanBhindawala我在說的不是spring beans,當然這在開始的時候會實例化。我正在談論'JSF ManagedBeans'看提供的文檔... –

+0

@IrfanBhindawala我編輯了答案,以澄清這一點。 –

0

調用失敗的任何bean都不會被注入到客戶端bean中 - 從而導致您的NPE。

即該豆是而不是如果@PostConstruct失敗則創建。

鑑於此,由於某個日誌文件中的故障會出現異常 - 但這與服務器有關。例如在Tomcat中,它可能出現在logs/localhost.YYYY-MM-DD.log(而不是catalina.out,很多人看)。