在同一页面上使用ajaxExceptionHandler的多个对话框

时间:2015-01-23 11:58:57

标签: primefaces exception-handling dialog

我有一个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>

当某些对话框打开并且在某些操作后发生异常时,没有任何反应。未显示ExceptionDialog。

1 个答案:

答案 0 :(得分:0)

问题是在对话框中创建的<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 );
    }