这是因为它在技术上是一个成功的Ajax响应。即,它已成功地将错误页面内容作为<partial-response>
Ajax 响应 XML 正文的一部分传递。
如果 Ajax 响应的状态为 500,则 JSF 根本不会解析 Ajax 响应 XML,而是调用处理程序,该onerror
处理程序反过来触发任何已注册的自定义客户端代码。这是事情变得复杂的地方,因为它默认不渲染任何东西,而FullAjaxExceptionHandler
真正想要利用现有的 JSF Ajax 渲染逻辑。
最好的办法是检查您的监控服务是否提供基于 Java 的 API 来手动通知错误情况。如果是这样,则覆盖其中一种FullAjaxExceptionHandler
方法来对其进行 ping 操作。是一个很好的shouldHandleExceptionRootCause()
候选人。如有必要,您还可以在此处instanceof
检查异常以跳过某些异常。
我对 Dynatrace 不熟悉,但如果您使用的是NewRelic,它会是这样的:
import com.newrelic.api.agent.NewRelic;
public class CustomExceptionHandler extends FullAjaxExceptionHandler {
@Override
protected boolean shouldHandleExceptionRootCause(FacesContext context, Throwable exception) {
try {
NewRelic.noticeError(exception);
}
catch (Exception e) {
// Log a WARN line
}
return true;
}
}
最后为它创建一个自定义ExceptionHandlerFactory
并用它替换FullAjaxExceptionHandlerFactory
in faces-config.xml
。