Image

Category:

Инициазация в JSF

А куда грамотно можно вставить функцию инициализации для JSF-приложения? Мне нужно при старте считывать из файла конфигурацию, а для этого нужно обратиться к FacesContext.getCurrentInstance().getExternalContext().getResourceAsStream("/WEB-INF/myconf.xml"). Вопрос в том, когда это можно сделать. Пока придумал 2 варианта:

1. Прописать в faces-config новый managed-bean со scope'ом равным application:
< managed-bean>
    < managed-bean-name>initBean< /managed-bean-name>
    < managed-bean-class>beans.InitBean< /managed-bean-class>
    < managed-bean-scope>application< /managed-bean-scope>
< /managed-bean>

Но, как оказалось, бин инициализируется не при старте, а при первом обращении. То есть, нужно ещё обратиться к нему на первой странице приложения, а это неудобно хотя бы из-за того, что первой страницы может и не быть.

2. Инициализировать приложение в дополнительном сервлете. Например, так:
web.xml
< servlet>
    < servlet-name>Faces Servlet< /servlet-name>
    < servlet-class>javax.faces.webapp.FacesServlet< /servlet-class>
    < load-on-startup>1< /load-on-startup>
< /servlet>
< servlet>
    < servlet-name>Init Servlet< /servlet-name>
    < servlet-class>servlets.InitServlet< /servlet-class>
    < load-on-startup>2< /load-on-startup>
< /servlet>

По идее, InitServlet должен загружаться после инициализации FacesServlet, однако FacesContext.getCurrentInstance(), вызванный в сервлете инициализации, почему-то возвращает null.
Как это лечится?

Или есть в JSF'е какой-то другой стандартный способ считывать конфиги?