Экземпляр FacesContext имеет значение null в ApplicationScoped Managedbean

Я создал bean-компонент ApplicationScoped, у которого есть метод PostConstruct с именем start. Всякий раз, когда я хочу получить экземпляр FacesContext в методе запуска, и он возвращает null:

@ManagedBean
@ApplicationScoped
public class RemoveOldFilesScheduler implements Serializable {

    @PostConstruct
    private void start() {
        final FacesContext facesContext = FacesContext.getCurrentInstance();
        if(facesContext != null) {
            String realDownloadDirName = facesContext.getExternalContext().getRealPath("/") + DOWNLOAD_DIRECTORY;
        File downloadDir = new File(realDownloadDirName);
        if (downloadDir.exists()) {
            removeOldFiles(downloadDir.listFiles());
        }
}
}

Как я могу получить доступ к facesContext в этой ситуации?

Я хочу получить реальный путь к моему каталогу загрузки в методе запуска, и я не знаю, как получить путь к моему каталогу без использования FaceContext.

Есть ли другой способ сделать это?


person Hosein Masbough    schedule 11.10.2014    source источник
comment
Какую версию JSF вы используете и в каком контейнере?   -  person kolossus    schedule 12.10.2014
comment
Я использую последнюю версию jsf (2.2.8-02).   -  person Hosein Masbough    schedule 12.10.2014
comment
Мне пришлось реализовать свой класс как Listener, поэтому я могу получить доступ к ServletContext в contextInitialized(ServletContextEvent sce)   -  person Hosein Masbough    schedule 12.10.2014
comment
Вы должны использовать getResourceAsStream вместо getRealPath stackoverflow.com/a/12160863/892994   -  person erencan    schedule 12.10.2014
comment
@erencan мой FacesContext имеет значение null и не может получить к нему доступ.   -  person Hosein Masbough    schedule 12.10.2014
comment
Компоненты @ApplicationScpoed должны создаваться с первым запросом. Я думаю, что-то инициализировало это в вашей конфигурации. Можете ли вы предоставить подробную информацию о вашем web.xml   -  person erencan    schedule 12.10.2014
comment
Начиная с JSF 2.2 (по крайней мере), вы можете использовать @Inject в управляемом компоненте JSF.   -  person kolossus    schedule 12.10.2014


Ответы (1)


Я реализую свой класс как Listener, и это сработало, и я могу получить доступ к ServletContext в методе contextInitialized:

    public class RemoveOldFilesListener implements ServletContextListener {

    public ServletContext servletContext;

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        servletContext = sce.getServletContext();
        String realDownloadDirName = servletContext.getRealPath("/") + DOWNLOAD_DIRECTORY;
        File downloadDir = new File(realDownloadDirName);
        if (downloadDir.exists()) {
            removeOldFiles(downloadDir.listFiles());
        }
}
person Hosein Masbough    schedule 12.10.2014
comment
Это, вероятно, лучший и более логичный способ сделать это, поскольку логика находится за пределами самого приложения JSF (что и должно быть) - person kolossus; 12.10.2014