2012-11-14 54 views
2

我需要在FacesServlet啓動時運行一些代碼,但由於FacesServlet聲明爲final,我無法擴展它並覆蓋init()方法。如何初始化Java FacesServlet

特別是,我想在開發和測試期間,在休眠已經下降並創建數據模型之後,將一些數據寫入數據庫。

有沒有辦法配置Faces來運行一些方法,例如在faces-config.xml中? 還是最好創建一個單獨的bean來完成初始化?

回答

5

使用eagerly initializedapplication scopedmanaged bean

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

    @PostConstruct 
    public void startup() { 
     // ... 
    } 

    @PreDestroy 
    public void shutdown() { 
     // ... 
    } 

} 

(類和方法名其實並不重要,它是免費給你的選擇,它是所有關於註釋)

這是保證建設FacesServlet的啓動,因此FacesContext將在必要時可用。這與其他答案建議的ServletContextListener相反。

+0

由於某種原因,這是行不通的。只有當我把一個方法放入它並從一個JSF頁面調用它時,Bean纔會被實例化。我使用Glassfish 3.1.2.2和JSF 2.1。 – Chris

+0

是否從正確的包中導入了@ ApplicationScoped?還有一個來自CDI,它不能與JSF'@ ManagedBean'結合使用。 JSF託管bean的行爲就像'@ NoneScoped'。 – BalusC

+0

謝謝!這是問題所在。我將導入修復爲javax.faces.bean.ApplicationScoped。 – Chris

0

您可以實現您自己的ServletContextListener,當Web應用程序啓動時會得到通知。由於它是一個管理的容器,你可以注入資源,可以做任何你想做的事情。另一種選擇是用@Startup創建一個@Singleton ejb,並在@PostCreate方法中完成工作。通常情況下,ServletContextListener可以正常工作,但是如果您的耳朵內有多個Web應用程序並且它們都共享相同的持久性上下文,則可以考慮使用@Singleton bean。

0

嘿,你可能想在這裏使用一些方面。只需將其設置爲運行之前

 void init(ServletConfig servletConfig) 
     //Acquire the factory instances we will 

//這是從here

也許this會幫助你。