FacesContext в @WebListener

Мне нужно построить некоторые URL-адреса JSF в @WebListener,

Я думал, что мог бы использовать фрагмент кода, как этот

    final FacesContext currentInstance = FacesContext.getCurrentInstance();
    final String actionURL = currentInstance.getApplication().getViewHandler()
            .getActionURL(currentInstance, viewId);

потому что Javadoc из .getCurrentInstance() утверждает, что он может быть "[...] вызван во время инициализации или завершения работы приложения", но он не работает, потому что возвращает ноль.

Я скучаю по somenthing? Любой другой способ построить URL, учитывая viewId?

Спасибо

1 ответ

Решение

FacesContext.getCurrentInstance() метод возвращает действительный facesContext экземпляр между линстенером (com.sun.faces.config.ConfigureListener в моем случае) инициализация и первый запуск FacesServlet, в котором facesContext настроенный слушателем освобождается. Моя проблема заключалась в том, что я позволил Wildfly добавить слушателя, и он был добавлен сразу после моего. Принудительно его загрузка в web-fragment.xml / web.xml

<listener>
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
</listener>
<listener>
    <listener-class>com.company.project.somepackages.Listener</listener-class>
</listener>

позвольте моему слушателю инициализировать контекст.

Однако приведенный выше код не сработал, поскольку viewHandler при попытке разрешить contextPath использует externalContext.getRequestContextPath() метод, который, очевидно, возвращает null и не externalContext.getApplicationContextPath() это может вернуть правильное значение.

Другие вопросы по тегам