javax.faces.FacesException:java.lang.RuntimeException:找不到FacesContext [英] javax.faces.FacesException: java.lang.RuntimeException: Cannot find FacesContext
问题描述
我正在尝试一个简单的项目来在jboss上工作,但是我陷入了这个错误(我已经尝试在URL上使用.jsf
). Tomcat工作正常的应用程序
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
我的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
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>
推荐答案
javax.faces.FacesException:java.lang.RuntimeException:找不到FacesContext
javax.faces.FacesException: java.lang.RuntimeException: Cannot find FacesContext
JSP页面中的
JSF组件抱怨找不到FacesContext
.负责创建此代码的是FacesServlet
.
JSF components in the JSP page are complaining that the FacesContext
cannot be found. The one responsible for creating this is the FacesServlet
.
在这里
<servlet-mapping>
<servlet-name>javax.faces.FacesServlet</servlet-name>
<url-pattern>*.faces</url-pattern>
</servlet-mapping>
您已声明FacesServlet
来收听*.faces
的url-pattern
.因此,要使FacesServlet
运行(并创建FacesContext
),您需要确保请求URL与 http://example.com/context/page.jsp .
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.
如果您想使用 http://example.com/context/page.jsf,那么您需要将FacesServlet
的url-pattern
更改为*.jsf
.
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
.
也就是说,FacesRedirectFilter
也可疑.是不是将*.jsp
重定向到*.jsf
?如果是这样,那么您还需要修改该过滤器.但是,如果唯一的目的是防止用户直接访问*.jsp
文件而不涉及FacesServlet
,则最好在web.xml
上添加以下安全约束:
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>
(并删除该Filter
).
与该问题无关,您提到了JSF 1.2,但是您已将faces-config.xml
声明为JSF 1.1.任何JSF 1.2或更高版本的实现都将回落到JSF 1.1兼容性.您还需要将其声明为JSF 1.2.
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">
(并摆脱该DOCTYPE
)
这篇关于javax.faces.FacesException:java.lang.RuntimeException:找不到FacesContext的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!