我需要在 FacesServlet 启动时运行一些代码,但由于 FacesServlet 被声明为 final,我无法扩展它并覆盖 init() 方法。
特别是,我想在开发和测试期间将一些数据写入数据库,在 hibernate 删除并创建数据模型之后。
有没有办法配置 Faces 以运行某些方法,例如在 faces-config.xml 中?还是最好创建一个进行初始化的单例bean?
我需要在 FacesServlet 启动时运行一些代码,但由于 FacesServlet 被声明为 final,我无法扩展它并覆盖 init() 方法。
特别是,我想在开发和测试期间将一些数据写入数据库,在 hibernate 删除并创建数据模型之后。
有没有办法配置 Faces 以运行某些方法,例如在 faces-config.xml 中?还是最好创建一个进行初始化的单例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。