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




并在server.log上包含所有stacktrace和所有内容。

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

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

可以说我有这个JSF代码段。



和bean.save();

公共(public)无效save()
{
尝试
{
em.merge(this.data);
}
catch(异常e)
{
//即使由于某种约束破坏原因而无法合并数据,也永远不会在这里。
}
}

如果有数据库错误,则在事务结束之前(AFTER save())我们将看不到它,因此我无法捕获它。 (这已通过调试演练以及在此处添加“em.flush()”使整个过程正常运行的事实得以确认)。

左右看后,我创建了一个PhaseListener,并且能够获取异常。但是,我无法在上显示该异常

公开无效afterPhase(最终PhaseEvent事件)
{
最终的Iterable exceptionEvents = event.getFacesContext()。getExceptionHandler()。getUnhandledExceptionQueuedEvents();
for(最终ExceptionQueuedEvent exceptionEvent:exceptionEvents)
{
//此打印输出(位于server.log中)。
System.out.println(“问题:” + exceptionEvent.getContext()。getException());
//但是此消息没有。
FacesContext.getCurrentInstance()。addMessage(null,新的FacesMessage(FacesMessage.SEVERITY_ERROR,“问题”,“问题:” + exceptionEvent.getContext()。getException()));
}
}

任何建议都非常感谢。

最佳答案

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

  • What is the correct way to deal with JSF 2.0 exceptions for AJAXified components?
  • 09-13 04:54