首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >java.lang.Throwable错误中显示的ViewExpiredException - web.xml中的页面

java.lang.Throwable错误中显示的ViewExpiredException - web.xml中的页面
EN

Stack Overflow用户
提问于 2010-07-09 02:49:32
回答 2查看 17.1K关注 0票数 18

我正在开发一个JSF web应用程序,如果视图过期,我需要调出一个“会话过期”页面,但对于所有其他页面,需要调出一个一般的技术错误页面。当我触发异常时,应用程序只会转到技术错误页面。下面是错误页的定义:

代码语言:javascript
复制
<error-page> 
    <exception-type>javax.faces.application.ViewExpiredException</exception-type> 
    <location>/jsps/utility/sessionExpired.jsp</location> 
</error-page> 
<error-page> 
    <exception-type>java.lang.Throwable</exception-type> 
    <location>/jsps/utility/technicalError.jsp</location> 
</error-page> 
<error-page>
    <error-code>500</error-code>
    <location>/jsps/utility/technicalError.jsp</location>
</error-page>

我删除了technicalError.jsp错误页面元素,它工作得很好,但是当我把它们放回原处时,我无法转到sessionExpired.jsp页面。我如何告诉web容器评估这些标记的顺序,以便显示正确的页面?谢谢。

EN

回答 2

Stack Overflow用户

发布于 2010-07-09 05:14:32

这是因为按照JSF规范,ViewExpiredException被包装在ServletException中。以下是JSF 1.2 specification第10.2.6.2章的摘录

10.2.6.2 FacesServlet

调用保存的Lifecycle实例的execute()方法,将此请求的FacesContext实例作为参数传递。如果execute()方法抛出FacesException,则以 ServletException 作为根本原因重新抛出它。

Servlet API规范中指定了如何分配错误页。以下是Servlet API specification 2.5第9.9.2章的摘录

SRV.9.9.2错误页

如果没有包含exception-typeerror-page声明符合类层次结构匹配,并且抛出的异常是ServletException或其子类,则容器提取包装的异常,如ServletException.getRootCause方法所定义的那样。对错误页声明进行第二遍,再次尝试与错误页声明进行匹配,但使用包装的异常。

在类层次结构中,ServletException已经与Throwable匹配,因此不会在第二次遍历时提取其根本原因。

要证明此指定行为,请将javax.faces.application.ViewExpiredException替换为javax.servlet.ServletException作为<exception-type>,然后重试。您将看到预期的错误页面正在显示。

要解决这个问题,只需在java.lang.Throwablejava.lang.Exception上删除错误页面即可。如果没有一个异常特定的错误页面匹配,那么无论如何它都会返回到500的错误代码。所以,你需要做的就是:

代码语言:javascript
复制
<error-page> 
    <exception-type>javax.faces.application.ViewExpiredException</exception-type> 
    <location>/jsps/utility/sessionExpired.jsp</location> 
</error-page> 
<error-page>
    <error-code>500</error-code>
    <location>/jsps/utility/technicalError.jsp</location>
</error-page>

bean更新:根据OP的(已删除)注释:为了可靠地测试这一点,您不能在构造函数或方法中执行throw new ViewExpiredException()。反过来,它会被某个EL异常所包裹。最后,您可以在Filter中添加一个打印rootCause的调试行,以亲自查看它。

如果您使用的是Eclipse/Tomcat,测试ViewExpiredException的快速方法如下所示:

Tomcat使用一个简单的命令按钮创建一个页面,部署并运行它,然后在webbrowser.

  1. Go中打开它返回到
  2. ,右键单击Tomcat并选择Clean Tomcat Work Directory。这将重新启动Tomcat 和回收站所有序列化会话(重要!仅仅重新启动Tomcat是不够的)。返回到and浏览器并按下命令按钮(无需重新加载页面beforehand!).

)

票数 17
EN

Stack Overflow用户

发布于 2020-08-12 00:24:27

正如BylusC所提到的,部署描述符不能包含任何将捕获ViewExpiredException (包装在ServletException中)的错误页面处理程序,而不能包含正确的ViewExpiredException错误页面。

不要忘记验证服务器的部署描述符(例如TomEE/conf/web.xml)不包含java.lang.Throwable或java.lang.Exception错误页定义。因为这两个web.xml基本上是合并的。

是-应用程序的web.xml优先于服务器的web.xml,但如果应用程序的web.xml包含

500 (/error.xhtml)的

  • 错误-页面

和服务器的web.xml

  • 500 (/500.html)和
  • 可线程(/bigerror.html)

则应用程序上下文将包含这两者的合并:

  • 500 (/error.xhtml)
  • Throwable (/bigerror.html)

并且ViewExpiredExcpetion错误处理将不能正常工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3206922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档