javax.faces.FacesException: java.lang.RuntimeException: не удается найти FacesContext
Компоненты JSF на странице JSP жалуются, что FacesContext
не может быть найден. Ответственный за создание этого - FacesServlet
.
Здесь
<servlet-mapping>
<servlet-name>javax.faces.FacesServlet</servlet-name>
<url-pattern>*.faces</url-pattern>
</servlet-mapping>
вы объявили FacesServlet
для прослушивания url-pattern
из *.faces
. Таким образом, чтобы запустить FacesServlet
(и создать FacesContext
), вам необходимо убедиться, что URL запроса соответствует http://example.com/context/page.faces и, таким образом, не http://example.com/context/page.jsp.
Если вы предпочитаете использовать http://example.com/context/page.jsf,, вам нужно изменить url-pattern
из FacesServlet
на *.jsf
.
Тем не менее, FacesRedirectFilter
также является подозрительным. Разве это не перенаправление *.jsp
на *.jsf
или около того? Если это так, то вам также нужно изменить этот фильтр. Однако, если единственное намерение состоит в том, чтобы запретить пользователям доступ к файлам *.jsp
напрямую без участия FacesServlet
, тогда лучше добавить следующее ограничение безопасности к web.xml
:
<security-constraint>
<display-name>Restrict direct access to JSP files</display-name>
<web-resource-collection>
<web-resource-name>JSP files</web-resource-name>
<url-pattern>*.jsp</url-pattern>
</web-resource-collection>
<auth-constraint />
</security-constraint>
(и удалите это Filter
).
Не имея отношения к проблеме, вы упомянули JSF 1.2, но вы объявили свой faces-config.xml
как JSF 1.1. Любая реализация JSF 1.2 или новее будет использовать JSF 1.1 совместимость. Вам также нужно объявить его как JSF 1.2.
<faces-config version="1.2"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">
(и избавиться от этого DOCTYPE
)