Websphere Portal Portlet 在发生异常后不会失败,而是在重新装入时重新触发所有事件



我正在开发一个应用程序,通常发生运行时异常(例如空指针异常)的 Portlet 将被替换为一个带有消息"Portlet 暂时禁用"的小框(在页面呈现/重新加载时)。但不知何故,我的应用程序并没有在未捕获的错误上失败,而是渲染页面,就好像没有问题一样(同时将巨大的堆栈跟踪吐入控制台)。您可能想知道为什么这很糟糕。

我在按钮操作方法中犯了一个错误,导致某个输入字段为空时NullPointerException。在此操作方法中,一些信息已插入到数据库中。网络表单静默失败,这就是我再按几次按钮的原因。然后我在输入字段中输入数据并再次按下按钮。现在,操作处理程序方法不再引发NullPointerException

但是,发生的事情是处理程序方法运行了 6 次(每次提交失败一次 + 1)。显然,导致 NullPointerException 的ActionEvent并没有从操作队列中删除,而是在随后的请求中重新触发。如果应用程序确实按预期被禁用,这不是问题。

谁能帮我解决这个问题?我需要让 Portlet 在未捕获的异常时再次失败,或者在每个渲染响应阶段后以某种方式清除人脸事件队列。

  1. 在实际发生 NPE 的位置放置一个断点。
  2. 在调试模式下启动服务器。
  3. 当服务器在断点处停止时,请查看堆栈并查看调用链。可能有什么东西正在"吞噬"您的 NPE。

当您针对定制设计的 Portlet 开发框架进行开发时,通常会发生这种情况。该框架中的设计缺陷可能会导致操作的异常处理不当。我以前见过这样的自定义框架。

最新更新