我有ErrorPage.jsp,其中有
<h:messages styleClass="messageError" id="messages1"></h:messages>
当在backing beans构造函数中发生异常时,我抓住它并执行以下操作
public constructorxxx throws Exception{
// code
// code
// code
catch(Exception e){
try{
LOG.error(e);
String customMessage = "An Unknown Error At " + e.getStackTrace()[0].toString() + "at" + message;
getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
customMessage, null));
throw new Exception();
}catch (IOException exception){
LOG.error(exception);
}
}
} // end of constructor
在我的Web.xml中,我使用了以下标记。
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/ErrorPage.jsp</location>
当我这样做时,我得到以下错误
1) Uncaught service() exception root cause Faces Servlet: javax.servlet.ServletException
2) An exception was thrown by one of the service methods of the servlet [/sc00/ErrorPage.jsp] in application [MembershipEligibilityScreensEAR]. Exception created : [java.lang.RuntimeException: FacesContext not found.
and in my page it displays as
SRVE0260E: The server cannot use the error page specified for your application to handle the Original Exception printed below.
Error Message: javax.servlet.ServletException
Error Code: 500
Target Servlet: Faces Servlet
Error Stack:
java.lang.Exception
// stack trace
Error Message: java.lang.RuntimeException: FacesContext not found
Error Code: 0
Target Servlet:
Error Stack:
java.lang.RuntimeException: FacesContext not found
很多人要求我将ErrorPage.jsp的位置更改为/sc00/ErrorPage.faces,但它在我的web.xml上显示一个断开的链接警告,错误是网页无法显示和编程错误。
我使用的是jsf 1.2,而我的“ErrorPage.jsp”没有支持bean。
有人可以建议我为什么没有显示Error.jsp吗?
答案 0 :(得分:3)
Faces消息是请求范围的,因此它们与当前HTTP请求 - 响应周期具有相同的生命周期。但是,您正在指示Webbrowser通过发送重定向来创建新的HTTP请求。新的HTTP请求中不再存在faces消息。
您最好抛出异常并将特定错误页面与<error-page>
中web.xml
条目的特定异常相关联。 servletcontainer将自动转发到同一请求中的特定错误页面。
E.g。
getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, customMessage, null));
throw new SomeException();
与
<error-page>
<exception-type>com.example.SomeException</exception-type>
<location>/sc00/ErrorPage.faces</location>
</error-page>
但是鉴于您的特定容器和JSF impl / version显然无法转发到基于JSF的错误页面(它是否在无限循环中运行?),那么最好的办法是从错误页面中删除所有JSF组件(否则你会得到RuntimeException: FacesContext not found
)并使它成为一个非常简单的vanilla JSP页面,只有HTML和JSTL。
<error-page>
<exception-type>com.example.SomeException</exception-type>
<location>/sc00/ErrorPage.jsp</location>
</error-page>
您应该只将消息放在异常中,而不是添加为面消息。
throw new SomeException(customMessage);
然后,您可以在错误页面中显示它,如下所示:
${requestScope['javax.servlet.error.message']}
你甚至可以让异常消失(即在行动方法中将其重新声明为throws
。
public void doSomething() throws SomeException {
// ...
}
无论如何,servletcontainer都会自动记录它。