【问题标题】:FullAjaxExceptionhandler only catches javax.el.ELException or java.lang.ThrowableFullAjaxExceptionhandler 只捕获 javax.el.E​​LException 或 java.lang.Throwable
【发布时间】:2013-03-04 01:08:16
【问题描述】:

FullAjacExceptionHandler 只能捕获 javax.el.E​​LException 或 java.lang.Throwable。 Throwable 也优先于 javax.el.E​​LException。我需要显式捕获托管 bean 抛出的特定异常。但是,ELException 显然包含了根本原因异常(即 LoginFailedException)。

我正在使用 JSF 2 (MyFaces 2.1.10)、Spring EL 解析器(Spring 托管 bean)、el-api-2.2 和 glassfish el-impl-2.2。

这是错误:

Ajax request: No
Status code: 500
Exception type: class org.apache.myfaces.view.facelets.el.ContextAwareELException
Exception message: javax.el.ELException: org.tests.omnifaces.exception.LoginFailedException: Login failed.
Stack trace: org.apache.myfaces.view.facelets.el.ContextAwareELException: javax.el.ELException: org.tests.omnifaces.exception.LoginFailedException: Login failed.
...

LoginFailedException 是一个简单的自定义异常。 我将不胜感激任何帮助。提前致谢。

编辑: 实验完成:

我创建了 3 个错误页面来查看在引发 LoginFailedException 时将调用/使用哪个错误页面。 XHTML 错误页面包含完全相同的代码,只是标头字符串标识了哪个是哪个。这是 web.xml 错误条目:

<error-page>
    <exception-type>org.tests.omnifaces.exception.LoginFailedException</exception-type>
    <location>/pages/errors/loginError.xhtml</location>
</error-page>

<error-page>
    <exception-type>javax.el.ELException</exception-type>
    <location>/pages/errors/elException.xhtml</location>
</error-page>

<error-page>
   <exception-type>java.lang.Throwable</exception-type>
   <location>/pages/errors/catchAllThrowable.xhtml</location>
</error-page>

catchAllThrowable.xhtml 将被使用。如果我删除(在 web.xml 上注释掉) Throwable ,将使用 ELException.xhtml。如果我删除 ELException,异常将由容器(tomcat)而不是 loginError.xhtml 处理。

希望这能澄清我的情况。

更新:

我现在使用 AJAX 调用提交表单(我想这是处理程序的用途),所有 3 个错误处理程序页面都在 web.xml 上处于活动状态(Throwable、ELException、LoginFailedException):

<h:commandButton id="loginButton" value="Login" action="#{login.loginUser}">
    <f:ajax execute="@form" render="@form messages" />
</h:commandButton>

Throwable 已被跳过,并且 ELException 已匹配(呈现 elException.xhtml)。仍然无法将 LoginFailedException 归零。

【问题讨论】:

  • 请发表您的功能需求以及您尝试解决的方法,否则没有人可以帮助您。
  • 感谢@Luiggi。我编辑了我的帖子以进行澄清。希望能帮助到你。目前,这只是一个实验/演示。我唯一的要求是使用 FullAjaxExceptionHandler 和相应的错误页面显示托管 bean 抛出的自定义异常。
  • 来自 OmniFaces 的代码 sn-p 表明它解开异常以找到根本原因并识别错误页面。我猜 BalusC 可以最好地回答这个问题:-)
  • 请尝试此处提供的快照:code.google.com/p/omnifaces/issues/detail?id=149
  • 快照解决了它。现在完美运行。非常感谢,@BalusC

标签: java jsf jsf-2 spring-el omnifaces


【解决方案1】:

FullAjaxExceptionHandler 仅解开FacesException 的根本原因。但是,MyFaces ContextAwareELException 不是 FacesException 的子类,而是 ELException 的子类,因此未解包。

根据 OmniFaces issue 149FullAjaxExceptionHandler 也被改进为展开 ELException。这从 OmniFaces 1.4 开始可用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    • 2015-04-16
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多