2013-01-05 66 views
9

也許我的問題是微不足道的,但我從來沒有使用過應用程序作用域bean。我需要應用程序bean,因爲我必須耗時處理數據庫上的事務。 我的搜索並沒有滿足我的好奇心。 我不知道爲什麼,但我沒有設法初始化bean(它是空的)或它的應用程序崩潰。 所以我有一個應用範圍豆JSF應用程序作用域實例化和注入

@ManagedBean(eager=true) 
@ApplicationScoped 
public class ApplicationContainer { 
... 
} 

急於=真我看了,告訴JSF應用程序服務器(我用的GlassFish)開始時每次啓動豆。

我讀了幾個地方,我只需要把這個註釋和bean初始化。 對我來說,不... 後,我看了,如果我想應用程序Bean注入到另一個bean我不得不使用@PostConstuct註釋

@ManagedBean 
@SessionScoped 
public class TestsBean implements Serializable { 

    private static final long serialVersionUID = 1L; 
    @ManagedProperty(value = "#{container}") 
    private ApplicationContainer container; 

    @PostConstruct 
    public void init() { 
    container.contructContainer(); 
    } 

這給在我注入其他bean的錯誤TestsBean進入...

  • 如果應用程序bean在服務器啓動時被初始化,它會在應用程序bean的主體中調用它來執行它所需的操作?或者在注入的bean中,它是在post構造方法中完成的?

請告訴我處理應用程序bean的正確方法。我真的很困惑...

謝謝大家的時間!

回答

21

有2個潛在的錯誤。

首先,@ManagedBean(eager=true)的工作方式如its javadoc所述,僅適用於應用程序範圍內的JSF託管bean。所以只有當您使用javax.faces.bean包(因此不包含javax.enterprise.context包!)的@ApplicationScoped時纔有效。 eager=true基本上意味着該bean將在webapp的啓動時被自動實例化,而不是僅在以後在EL中第一次被引用。其次,根據Javabeans規範,託管bean名稱默認爲解壓縮形式的類名。您沒有明確指定任何託管bean名稱,如@ManagedBean(name="container", eager=true),因此託管bean名稱將默認爲applicationContainer,但是您仍然試圖將其引用爲#{container}而不是#{applicationContainer}

你並不清楚你面臨哪些問題/錯誤。如果你得到一個異常,你應該完全讀/解釋它,如果你無法理解它,請在整個問題中對其進行全面粘貼 - 包括堆棧跟蹤。它代表了你自己問題的完整答案。你只需要解釋和理解它(或者我們只需要用外行的話來解釋它)。你應該不會忽視它們,把它們看作是不相關的裝飾。他們不是!

所有的一切,完整和正確的做法是,擁有齊全的進口申報只是可以肯定的,也有一些窮人的調試標準輸出打印:

package com.example; 

import javax.faces.bean.ApplicationScoped; 
import javax.faces.bean.ManagedBean; 

@ManagedBean(eager=true) 
@ApplicationScoped 
public class ApplicationContainer { 

    public ApplicationContainer() { 
     System.out.println("ApplicationContainer constructed"); 
    } 

} 
package com.example; 

import java.io.Serializable; 
import javax.annotation.PostConstruct; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ManagedProperty; 
import javax.faces.bean.SessionScoped; 

@ManagedBean 
@SessionScoped 
public class TestsBean implements Serializable { 

    @ManagedProperty("#{applicationContainer}") 
    private ApplicationContainer container; 

    public TestsBean() { 
     System.out.println("TestsBean constructed"); 
    } 

    @PostConstruct 
    public void init() { 
     System.out.println("ApplicationContainer injected: " + container); 
    } 

    public void setContainer(ApplicationContainer container) { 
     this.container = container; 
    } 

} 
+0

謝謝BalusC您充足的答案。 我沒有把我的例外放在這個問題上,因爲我想成爲一個普遍的問題,而不是一個具體的問題。 我認爲應用程序範圍bean需要一個更具體的,不同的初始化他們休息,我還沒有找到一個適當的初始化,只是零零星星。 再次感謝您的時間! – CyberGriZzly

相關問題