当前位置: 首页 > 知识库问答 >
问题:

添加来自PhaseListener的消息

申屠宗清
2023-03-14

我通过Primefaces AJAX调用从SQL操作中获得了一些未捕获异常。有趣的是,这个未捕获的异常在Firebug的JavaScript secion上显示为error:

<?xml version='1.0' encoding='UTF-8'?>
<partial-response><error><error-name>class javax.faces.el.EvaluationException</error-name><error-message><![CDATA[Transaction rolled back]]></error-message></error></partial-response>

并在server.log上使用所有stacktrace和所有内容。

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

正确的处理方法是创建验证器,我会这样做,但总有可能出现没有意识到的数据库问题,它只会在执行SQL操作时出现。所以我只讨论没有验证器的情况。

假设我有这个JSF片段。

    <h:form>
        <p:messages />
        <..... primefaces (AJX) some button .... action="bean.save()" />
    </h:form>

和Bean.save();

  public void save()
  {
    try
    {
       em.merge(this.data);
    }
    catch(Exception e)
    {
       // never been in here EVEN if the data can't be merge for some constraint breaking reason.
    }
  }
    public void afterPhase(final PhaseEvent event)
    {
        final Iterable exceptionEvents = event.getFacesContext().getExceptionHandler().getUnhandledExceptionQueuedEvents();
        for (final ExceptionQueuedEvent exceptionEvent : exceptionEvents)
        {
            // This print out goes (found in server.log).
            System.out.println("Problem: " + exceptionEvent.getContext().getException());
            // But this message does not.
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Problem", "Problem: " + exceptionEvent.getContext().getException()));
        }
    }

任何建议都非常感谢。

共有1个答案

宿楚青
2023-03-14

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

  • 处理Ajaxifed组件的JSF 2.0异常的正确方法是什么?
 类似资料:
  • 我正在学习java,我正在尝试从另一个类向我的框架中添加一个菜单栏(练习将代码分成多个类以更好地组织程序)。 以下是我的代码示例: 和menubar类: 我使用eclipse,在这行中: “add”带下划线,因此我无法编译代码。 我一直在寻找解决这个问题的方法,据我所知,这应该是可行的。 感谢您的帮助。 非常感谢。 乔什

  • 问题内容: 我要运行一个Node.js进程,因为它正在检查Redis服务器是否有新弹出的东西。 另一个进程将不定期地进行推送,而Node进程将尝试弹出任何进来的消息。Node进程将保持运行。 谁能指出我的正确方向? 我正在尝试弄清楚如何监听此类事件。当然,我可以将其弹出一次,但是如何让Node进程继续侦听Redis服务器上的任何内容? 问题答案: 您将要使用阻止流行音乐:http : //redi

  • 这是否意味着即使有一个使用者实例,我们也能够并行地使用来自三个分区的消息。 这是否可以作为替代,以增加Kafka主题的消耗率,而不增加分区的数量。我知道的唯一的另一种方法是创建一个线程池,并将接收到的消息提交给它。我们是否可以使用ConcurrentKafkaListenerContainerFactory作为该流程的替代,因为这听起来显然更容易实现。

  • 线程名称:线程组1-1示例开始时间:2019-09-11 18:52:42英国夏令时加载时间:0连接时间:0延迟时间:0大小以字节为单位:0发送字节:0头大小以字节为单位:0主体大小以字节为单位:0示例计数:1错误计数:1数据类型(“text”“bin”“”):文本响应代码:000响应消息:javax.naming.nameNotFoundException:DynamicQueue/MyQueu

  • 我目前正在我们的项目中实现Spring Cloud Sleuth。我需要将traceId添加到响应标头。有没有办法实现这一点? 谢谢, Anoop

  • 我有一个用java编写的Maven JAX RS项目,使用enuncicate在每次构建时自动生成文档。到目前为止,它运行良好——他为我的项目中的所有RESTendpoint生成api文档。 现在我也用有用的jdoc写了一些util类——但是这些类不是endpoint——所以,expertion不会包括它们。 有没有办法告诉enunicate,他应该用一些额外类的jdoc生成额外的文档?我认为应该