3

我需要在 FacesServlet 启动时运行一些代码,但由于 FacesServlet 被声明为 final,我无法扩展它并覆盖 init() 方法。

特别是,我想在开发和测试期间将一些数据写入数据库,在 hibernate 删除并创建数据模型之后。

有没有办法配置 Faces 以运行某些方法,例如在 faces-config.xml 中?还是最好创建一个进行初始化的单例bean?

4

3 回答 3

7

使用预先初始化的 应用程序范围的 托管 bean

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

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

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

}

(类名和方法名其实无关紧要,你可以自由选择,都是关于注解的)

这保证在 启动FacesServlet构建,因此FacesContext将在必要时可用。ServletContextListener这与其他答案所建议的相反。

于 2012-11-14T12:17:49.407 回答
0

您可以实现自己的ServletContextListener,它会在 Web 应用程序启动时收到通知。由于它是一个托管容器,因此您可以注入资源,您可以随心所欲地做任何事情。另一种选择是使用@Startup 创建一个@Singleton ejb 并在它的@PostCreate 方法中完成工作。通常 ServletContextListener 可以正常工作,但是如果您的耳朵中有多个 Web 应用程序并且它们都共享相同的持久性上下文,您可以考虑使用 @Singleton bean。

于 2012-11-14T11:53:09.873 回答
0

嘿,您可能想在这里使用某些方面。只需将其设置为之前运行

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

//这是从这里

也许会对你有所帮助。

于 2012-11-14T11:57:04.467 回答