我需要在FacesServlet启动时运行一些代码,但是当FacesServlet被声明为final时,我无法扩展它并覆盖init()方法。
特别是,我希望在hibernate删除并创建数据模型之后,在开发和测试期间将一些数据写入数据库。
有没有办法配置Faces来运行某些方法,例如在faces-config.xml中? 或者最好创建一个执行初始化的单例bean吗?
答案 0 :(得分:7)
使用eagerly initialized application scoped managed bean。
@ManagedBean(eager=true)
@ApplicationScoped
public class App {
@PostConstruct
public void startup() {
// ...
}
@PreDestroy
public void shutdown() {
// ...
}
}
(类和方法名称实际上并不重要,它可以自由选择,所有关于注释)
保证在启动FacesServlet
之后构建,以便FacesContext
在必要时可用。这与其他答案所建议的ServletContextListener
相反。
答案 1 :(得分:0)
您可以实现自己的ServletContextListener,以便在启动Web应用程序时收到通知。由于它是一个容器管理,你可以注入资源,你可以做任何你想做的事情。另一个选择是使用@Startup创建一个@Singleton ejb并在其中使用@PostCreate方法。通常ServletContextListener工作正常,但是如果你在耳朵里面有多个Web应用程序并且它们都共享相同的持久化上下文,你可以考虑使用@Singleton bean。
答案 2 :(得分:0)