我需要在FacesServlet啓動時運行一些代碼,但由於FacesServlet聲明爲final,我無法擴展它並覆蓋init()方法。如何初始化Java FacesServlet
特別是,我想在開發和測試期間,在休眠已經下降並創建數據模型之後,將一些數據寫入數據庫。
有沒有辦法配置Faces來運行一些方法,例如在faces-config.xml中? 還是最好創建一個單獨的bean來完成初始化?
我需要在FacesServlet啓動時運行一些代碼,但由於FacesServlet聲明爲final,我無法擴展它並覆蓋init()方法。如何初始化Java FacesServlet
特別是,我想在開發和測試期間,在休眠已經下降並創建數據模型之後,將一些數據寫入數據庫。
有沒有辦法配置Faces來運行一些方法,例如在faces-config.xml中? 還是最好創建一個單獨的bean來完成初始化?
使用eagerly initializedapplication scopedmanaged bean。
@ManagedBean(eager=true)
@ApplicationScoped
public class App {
@PostConstruct
public void startup() {
// ...
}
@PreDestroy
public void shutdown() {
// ...
}
}
(類和方法名其實並不重要,它是免費給你的選擇,它是所有關於註釋)
這是保證建設後FacesServlet
的啓動,因此FacesContext
將在必要時可用。這與其他答案建議的ServletContextListener
相反。
您可以實現您自己的ServletContextListener,當Web應用程序啓動時會得到通知。由於它是一個管理的容器,你可以注入資源,可以做任何你想做的事情。另一種選擇是用@Startup創建一個@Singleton ejb,並在@PostCreate方法中完成工作。通常情況下,ServletContextListener可以正常工作,但是如果您的耳朵內有多個Web應用程序並且它們都共享相同的持久性上下文,則可以考慮使用@Singleton bean。
由於某種原因,這是行不通的。只有當我把一個方法放入它並從一個JSF頁面調用它時,Bean纔會被實例化。我使用Glassfish 3.1.2.2和JSF 2.1。 – Chris
是否從正確的包中導入了@ ApplicationScoped?還有一個來自CDI,它不能與JSF'@ ManagedBean'結合使用。 JSF託管bean的行爲就像'@ NoneScoped'。 – BalusC
謝謝!這是問題所在。我將導入修復爲javax.faces.bean.ApplicationScoped。 – Chris