从 PhaseListener 添加消息

Posted

技术标签:

【中文标题】从 PhaseListener 添加消息【英文标题】:Add message from PhaseListener 【发布时间】:2012-08-13 07:45:01 【问题描述】:

我基本上从通过 Primefaces AJAX 调用的 SQL 操作中得到了一些未捕获的异常。有趣的是,这个未捕获的异常在 FireBug 的 javascript 部分出现错误:

class javax.faces.el.E​​valuationException

在 server.log 上包含所有堆栈跟踪和所有内容。

但如果不将用户重定向到单独的错误页面(并丢失所有输入数据),我无法将其引起用户注意。

创建验证器的正确方法是,我会这样做,但总是有可能出现不知情的数据库问题,只会出现在执行 SQL 操作。所以我只谈论没有验证者的情况。

假设我有这个 JSF sn-p。

<..... primefaces .... action="bean.save()">

还有 bean.save();

公共无效保存() 尝试 em.merge(this.data); 捕获(异常 e) // 即使由于某些破坏约束的原因无法合并数据,也从未在这里。

如果出现数据库错误,我们将在事务结束(AFTER save())之前看到它,所以我无法捕捉到它。 (这已通过调试演练得到证实,并且在此处添加“em.flush()”可以使整个工作正常进行)。

左右看了之后,我创建了一个 PhaseListener 并且我能够得到异常。但是,我无法在

上显示该异常 public void afterPhase(最终 PhaseEvent 事件) final Iterable exceptionEvents = event.getFacesContext().getExceptionHandler().getUnhandledExceptionQueuedEvents(); 对于(最终的 ExceptionQueuedEvent 异常事件:异常事件) // 这个打印出来(在 server.log 中找到)。 System.out.println("问题:" + exceptionEvent.getContext().getException()); // 但是这个消息没有。 FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Problem", "Problem:" + exceptionEvent.getContext().getException()));

非常感谢任何建议。

【问题讨论】:

【参考方案1】:

PhaseListener 不是处理异常的正确位置。您应该使用ExceptionHandler。您需要在代码中进行的唯一其他更改是您应该使用Iterator 迭代异常并使用Iterator#remove() 从队列中删除已处理的异常。否则,它仍将由默认异常处理程序以您所看到的 ajax 响应的形式处理。

另见:

What is the correct way to deal with JSF 2.0 exceptions for AJAXified components?

【讨论】:

以上是关于从 PhaseListener 添加消息的主要内容,如果未能解决你的问题,请参考以下文章

玩转 Redis:简单消息队列

如何在 Scala 中将元素添加到 Map 中,其中键是字符串,值是 List[String]

C++MFC模式下List Control怎么实现双击获取内容

如何从过滤器中读取 JSF 会话 bean?

Redis 竟然能用 List 实现消息队列

Redis 竟然能用 List 实现消息队列