javax.faces.FacesException: java.lang.RuntimeException: не удается найти FacesContext - PullRequest
2 голосов
/ 20 декабря 2010

Я пытаюсь выполнить простой проект для работы с jboss, но я застрял в этой ошибке (я уже пытался использовать .jsf в URL).приложение в tomcat отлично работает

javax.servlet.ServletException: java.lang.RuntimeException: Cannot find FacesContext
 javax.faces.webapp.FacesServlet.service

root cause

javax.faces.FacesException: java.lang.RuntimeException: Cannot find FacesContext
 org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch(ServletExternalContextImpl.java:425)
 org.apache.myfaces.application.jsp.JspViewHandlerImpl.renderView(JspViewHandlerImpl.java:211)
 org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:41)
 org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:132)
 javax.faces.webapp.FacesServlet.service(FacesServlet.java:140)
 org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96

my web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
         version="2.4">
 <listener>
  <listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
 </listener> 

<servlet>
    <servlet-name>javax.faces.FacesServlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>javax.faces.FacesServlet</servlet-name>
    <url-pattern>*.faces</url-pattern>
  </servlet-mapping>
  <filter>
    <filter-name>faces-redirect-filter</filter-name>
    <filter-class>core.FacesRedirectFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>faces-redirect-filter</filter-name>
    <url-pattern>*.jsp</url-pattern>
  </filter-mapping>

  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>
</web-app>

face-config xml

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE faces-config PUBLIC
"-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"
"http://java.sun.com/dtd/web-facesconfig_1_1.dtd">    

<faces-config>
  <managed-bean>
    <managed-bean-name>resumeBean</managed-bean-name>
    <managed-bean-class>core.ResumeBean</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
  </managed-bean>
  <managed-bean>
    <managed-bean-name>colorBean</managed-bean-name>
    <managed-bean-class>core.ColorBean</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
  </managed-bean>
  <navigation-rule>
    <from-view-id>/customize.jsp</from-view-id>
    <navigation-case>
      <from-outcome>same-color</from-outcome>
      <to-view-id>/WEB-INF/results/same-color.jsp</to-view-id>
    </navigation-case>
    <navigation-case>
      <from-outcome>success</from-outcome>
      <to-view-id>/WEB-INF/results/show-preview.jsp</to-view-id>
    </navigation-case>
  </navigation-rule>
  <navigation-rule>
    <from-view-id>/customize-bg.jsp</from-view-id>
    <navigation-case>
      <from-outcome>success</from-outcome>
      <to-view-id>/WEB-INF/results/show-preview2.jsp</to-view-id>
    </navigation-case>
  </navigation-rule>
</faces-config>

1 Ответ

3 голосов
/ 20 декабря 2010

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)

...