Java 在JSF页面中显示错误并继续呈现它,而不是重定向到单独的错误页面

Java 在JSF页面中显示错误并继续呈现它,而不是重定向到单独的错误页面,java,jsf,exception-handling,lifecycle,Java,Jsf,Exception Handling,Lifecycle,只要在加载JSF facelet期间出现错误,JSF就会在错误点停止呈现页面,并显示错误页面(默认行为)。我希望JSF继续呈现页面,并在页面中显示异常/错误。例如,如果页面正在加载一个“portlet”,它抛出一个异常,那么该异常将在portlet中显示为文本。我不希望整个页面被转发到一个单独的错误页面 我已经初始化了自己的ExceptionHandlerFactory和ExceptionHandler实现,可以成功地迭代ExceptionQueueEvents。然而,我不知道如何指示JSF继续

只要在加载JSF facelet期间出现错误,JSF就会在错误点停止呈现页面,并显示错误页面(默认行为)。我希望JSF继续呈现页面,并在页面中显示异常/错误。例如,如果页面正在加载一个“portlet”,它抛出一个异常,那么该异常将在portlet中显示为文本。我不希望整个页面被转发到一个单独的错误页面

我已经初始化了自己的
ExceptionHandlerFactory
ExceptionHandler
实现,可以成功地迭代
ExceptionQueueEvents
。然而,我不知道如何指示JSF继续加载页面,尽管出现了错误。这是正确的方法吗?例外处理程序是在(假设)之后调用还是在中间处理小面?如果在之后,在我的
异常处理程序中有什么可以做的吗

我知道我应该:

  • 隐藏用户无法访问的部分(我的具体案例涉及安全性,当用户尝试加载他无权访问的内容时。但是,我正在寻找一个全局答案)
  • 手动处理错误,以便不会引发意外异常
但是,我希望用户能够继续使用系统,尽管存在一些小的组件故障(例如,如果某个Newsfeedportlet抛出一个错误,该错误不应阻止用户查看其他内容并使用它)


我使用的是Mojarra 2.0.2。我觉得这是一个很容易解决的问题,但我无法解决:(

这样做意味着你给了最终用户一个不完整的HTML页面(因为JSF还没有(也不能)完成HTML呈现),而且还没有说明webbrowser将如何显示页面


不要这样做。

如果你的页面有不同的内容,考虑使用(i)帧。这样,如果某个特定的内容无法加载,整个页面仍然会呈现,但是该框架会显示错误页面。这当然意味着你所有的独立组件都是完整的HTML页面。

BalusC绝对正确,您不应该尝试处理任何解析异常等。奇怪的是,呈现的页面段对用户不友好,可能会导致非常奇怪的结果


如果您有角色/权限问题,这些场景应该与jsf呈现分开维护。在转发到页面之前,而不是在尝试呈现页面时,应该确认授权。

必须避免呈现不完整的HTML,我同意,但在某些情况下HTML仍然有效。例如,如果我这样做#{myBean.someProperty}并且该属性对当前用户是禁止的(引发异常),页面可能只显示错误文本,而不显示属性,如AccessDeniedException,HTML仍然有效。我可能希望初始化一个特殊的bean/facelet,以合理的方式报告抛出的异常。我确实同意在许多情况下页面会断开,但如果小心使用,也可以保证有效的输出?在这里,<代码>呈现 ATRITBUTY。是的,我将尽力抢占先例避免异常,并尽可能地捕获它们。然而,让我们考虑一下,我有一个JSF组件,在它后面调用一个托管bean。在执行过程中,抛出一个非常意外的异常而没有被捕获。是否有一个方法,而不是重定向?g将用户引导到错误页面,以显示一些通用错误来代替portlet(可能是整个facelet)并继续渲染页面的其余部分?假设portlet与页面中的其他元素没有关系,你还会认为这是一件坏事吗?这表示“代码> RunTimeExtExabor <代码>,所以是的,很可能是坏的。作为一个完全不同的选择,你可以考虑JSTL的代码> C:catch < /C>。但是,除了处理之外,在视图端进行复制是一个坏主意。只需在业务/模型端捕获它,并相应地设置一些令牌/切换,以便视图可以使用
rendered
attribtue进行拦截。感谢指向
c:catch
的指针。看起来它可能有一些问题,但也可以这样做,因此我将选择此作为接受的答案。在但是,我不会使用
c:catch
,而是会遵循您的建议,不忽略页面中间的错误,而是重定向到单独的错误页面,告诉用户问题所在,并允许用户在崩溃报告中输入一些附加信息。我不认为这一定是一种更好的方法,但肯定更安全。使用iframes是一种更好的方法好主意,但可能不太方便。正如我在问题“我知道我应该:隐藏用户无法访问的部分”中所述。我将尝试隐藏禁止的元素并预先捕获异常。但是,总是会有异常泄漏,如果异常源是某个次要组件,我不想丢弃整个页面。重新考虑这个问题后,我认为用一些错误文本f替换失败元素的内容就足够了JSF组件的特性。不需要在任何地方都支持它。还有什么想法吗?