2

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

我在按钮操作方法中犯了一个错误,导致NullPointerException某个输入字段为空。在此操作方法中,一些信息被插入到数据库中。Web 表单无声无息地失败了,这就是我多按几次按钮的原因。然后我在输入字段中输入数据并再次按下按钮。现在动作处理程序方法不再抛出NullPointerException

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

谁能帮我这个?我需要让 portlet 在未捕获的异常上再次失败,或者在每个渲染响应阶段之后以某种方式清除 faces 事件队列。

4

1 回答 1

0
  1. 在 NPE 实际发生的地方放置一个断点。
  2. 以调试模式启动服务器。
  3. 当服务器在断点处停止时,查看堆栈并查看调用链。某些东西可能正在“吞噬”您的 NPE。

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

于 2012-09-23T14:41:51.573 回答