If you're using p:ajaxExceptionHandler in your HTML dialogs and you're finding mysterious error messages in the ivy.log, this post might help you identify the cause.
The reported errors may seem unspecific, but related to the JSF stack, such as ViewExpiredException. An error message like this might contain No default error page, e.g.:
[2026-01-01][ERROR][org.primefaces.application.exceptionhandler.PrimeExceptionHandler]
Could not handle exception!
java.lang.IllegalArgumentException: No default error page (Status 500 or java.lang.Throwable) and no error page for type "class javax.faces.application.ViewExpiredException" defined!
at org.primefaces.application.exceptionhandler.PrimeExceptionHandler.evaluateErrorPage(PrimeExceptionHandler.java:435)
at org.primefaces.application.exceptionhandler.PrimeExceptionHandler.handleRedirect(PrimeExceptionHandler.java:371)
at org.primefaces.application.exceptionhandler.PrimeExceptionHandler.handleAjaxException(PrimeExceptionHandler.java:218)
at org.primefaces.application.exceptionhandler.PrimeExceptionHandler.handle(PrimeExceptionHandler.java:113)
at ch.ivyteam.ivy.jsf.primefaces.exception.IvyPrimeExceptionHandler.handle(IvyPrimeExceptionHandler.java:30)
...
Next, I recommend checking the ivy.log for a warning message containing the following:
Could not build view or lookup a AjaxExceptionHandler component
e.g.
[2026-01-01][WARN ][org.primefaces.application.exceptionhandler.PrimeExceptionHandler]
Could not build view or lookup a AjaxExceptionHandler component!
javax.faces.view.facelets.TagAttributeException: ... java.lang.NullPointerException: Cannot invoke "ch.ivyteam.ivy.security.IUser.getProperty(String)" because the return value of "ch.ivyteam.ivy.workflow.IWorkflowSession.getSessionUser()" is null
at org.apache.myfaces.view.facelets.tag.TagAttributeImpl.getObject(TagAttributeImpl.java:460)
at org.apache.myfaces.view.facelets.tag.TagAttributeImpl.getBoolean(TagAttributeImpl.java:144)
at org.apache.myfaces.view.facelets.tag.jstl.core.IfHandler.apply(IfHandler.java:110)
at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:46)
...
This warning usually points to the actual root cause, such as a NullPointerException in an underlying bean, which ultimately causes the p:ajaxExceptionHandler itself to fail.
The reason is that when an exception such as ViewExpiredException occurs, the AjaxExceptionHandler attempts to resolve the views. During this process, components and tags within those views are evaluated. If one of them fails, the exception handler cannot complete its processing.
Consider the following example from a dialog where errors are handled by p:ajaxExceptionHandler:
<c:if test="#{myBean.filter()}">
If myBean.filter() throws a NullPointerException while the AjaxExceptionHandler is resolving the view (due to ViewExpiredException), the handler itself fails. As a result, instead of rendering the configured error page, you may see the No default error page message shown above.