javax.faces.FacesException:java.lang.RuntimeException:找不到 FacesContext

发布于 2024-10-08 08:11:34 字数 3870 浏览 0 评论 0原文

我正在尝试一个简单的项目来在 jboss 上工作,但我陷入了这个错误(我已经尝试在 URL 上使用 .jsf)。 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

我的 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>

faces-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>

I'm trying a simple project to work on jboss, but I'm stuck at this error (I already tried using .jsf on the URL). the application in tomcat work's fine

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>

faces-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>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

秋凉 2024-10-15 08:11:34

javax.faces.FacesException:java.lang.RuntimeException:找不到 FacesContext

JSP 页面中的 JSF 组件抱怨找不到 FacesContext。负责创建它的是FacesServlet

在这里,

<servlet-mapping>
    <servlet-name>javax.faces.FacesServlet</servlet-name>
    <url-pattern>*.faces</url-pattern>
</servlet-mapping>

您已声明 FacesServlet 来侦听 *.facesurl-pattern。因此,要运行 FacesServlet(并创建 FacesContext),您需要确保请求 URL 匹配 http://example.com/context/page.faces 因此不是 http://example.com/context/page.jsp

如果您想使用 http://example.com/context/page.jsf,那么您需要将FacesServleturl-pattern 更改为*.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> 

并删除该过滤器)。


与该问题无关,您提到了 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

javax.faces.FacesException: java.lang.RuntimeException: Cannot find FacesContext

JSF components in the JSP page are complaining that the FacesContext cannot be found. The one responsible for creating this is the FacesServlet.

Here,

<servlet-mapping>
    <servlet-name>javax.faces.FacesServlet</servlet-name>
    <url-pattern>*.faces</url-pattern>
</servlet-mapping>

you've declared the FacesServlet to listen on an url-pattern of *.faces. So, to get the FacesServlet to run (and to create the FacesContext) you need to ensure that the request URL matches http://example.com/context/page.faces and thus not http://example.com/context/page.jsp.

If you rather want to use http://example.com/context/page.jsf, then you need to change the url-pattern of the FacesServlet to *.jsf.


That said, the FacesRedirectFilter is suspicious as well. Isn't it redirecting *.jsp to *.jsf or so? If so, then you need to modify that filter as well. However, if the sole intent is to prevent users from accessing *.jsp files directly without involvement of FacesServlet, then better add the following security constraint to the 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> 

(and remove that Filter).


Unrelated to the problem, you mentioned JSF 1.2, but you've declared your faces-config.xml as JSF 1.1. Any JSF 1.2 implementation or newer will fall back to JSF 1.1 compatibility. You need to declare it as JSF 1.2 as well.

<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">

(and get rid of that DOCTYPE)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文