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()
это может вернуть правильное значение.