同一页面上带有 ajaxExceptionHandler 的多个对话框

Multiple dialogs with ajaxExceptionHandler on the same page

我有一个 xhtml 页面,其中声明了几个对话框

<ui:include src="/pages/dialogs/dialog1.xhtml"></ui:include>
<ui:include src="/pages/dialogs/dialog2.xhtml"></ui:include>
...

对话框是 dynamic="true" 并且每个对话框都有 ajaxExceptionHandler

    <p:ajaxExceptionHandler update="exceptionDialog" onexception="PF('exceptionDialog').show();" /> 
<p:dialog widgetVar="exceptionDialog" id="exceptionDialog">...</p:dialog>

当某些对话框打开并在某些操作后发生异常时,什么也没有发生。未显示异常对话框。

问题是 <p:ajaxExceptionHandler> 在页面中包含 <ui:include> 对话框之后创建,但为时过早。您需要在出现对话框时创建它,因此您需要在托管 bean 中动态创建它。 在每个对话框中执行此操作

删除 <p:ajaxExceptionHandler> 标签。 并添加 ...

<h:panelGroup id="ajaxExceptionHandlerPlaceholder">
</h:panelGroup>

<p:outputLabel id="exceptionMessage" value="#{pfExceptionHandler.message}" style="color: red" />

<script>
     createAjaxExceptionHandlerCommand();
</script>
</p:dialog>

在托管bean中添加这个方法

   public void createAjaxExceptionHandler() {
        AjaxExceptionHandler aeh = new AjaxExceptionHandler();
        aeh.setType( null );
        aeh.setUpdate( "exceptionMessage" );

        FacesContext context = FacesContext.getCurrentInstance();
        UIViewRoot root = context.getViewRoot();
        final UIComponent[] found = new UIComponent[1];
        root.visitTree( new FullVisitContext( context ), new VisitCallback() {
            @Override
            public VisitResult visit( VisitContext context, UIComponent component ) {
                if ( component.getId().equals( "ajaxExceptionHandlerPlaceholder" ) ) {
                    found[0] = component;
                    return VisitResult.COMPLETE;
                }
                return VisitResult.ACCEPT;
            }
        } );

        found[0].getChildren().add( aeh );
    }