处理TagAttributeException和更改ui: inclesrc



我们在页面中有动态菜单项,并且include-source .xhtml的链接存储在DB中,在这种情况下,如果源xhtml输入错误或未能找到应用程序上下文,它会抛出带有无效路径消息的TagAttributeException。

在此事件之后,如果我们发出任何ajax请求失败,原因是在恢复视图阶段试图使用无效的xhtml(包括src)进行恢复。

是否有办法在运行时处理此异常并将xhtml src更改为某些默认xhtml ?这样任何进一步的AJAX调用都可以工作。

XHTML

 <h:form prependId="false">            
          <p:commandButton actionListener="#{exceptionPF.includePage()}"
                 ajax="true"
                 value="Include Wrong Source" />
           <p:commandButton actionListener="#{exceptionPF.includeRightPage()}"
                 ajax="true"
                 value="Include Right Source" />
          <p:panel id="div1" >
              <ui:include src="#{exceptionPF.srcPage}" />
          </p:panel>          

         <p:ajaxExceptionHandler type="javax.faces.view.facelets.TagAttributeException"
                        update="exceptionDialog"
                        onexception="PF('exceptionDialog').show();" />

       <p:dialog id="exceptionDialog" header="Exception '#{pfExceptionHandler.type}' occured!" widgetVar="exceptionDialog"
          height="500px">
    Message: #{pfExceptionHandler.message} <br/>
    Stack-Trace: <h:outputText value="#{pfExceptionHandler.formattedStackTrace}" escape="false" /> <br />
    <p:button onclick="document.location.href = document.location.href;"
              value="Reload!"
              rendered="#{pfExceptionHandler.type == 'javax.faces.application.ViewExpiredException'}" />
</p:dialog>

    </h:form>
憨豆

@Named
@ViewScoped
public class ExceptionPF implements Serializable {
String srcPage;
public String getSrcPage() {
    return srcPage;
}
public void setSrcPage(String srcPage) {
    this.srcPage = srcPage;
}
public void includePage()
{ 
    setSrcPage("wrong.xhtml");
    RequestContext.getCurrentInstance().update("div1");
}
 public void includeRightPage()
{
    setSrcPage("correct.xhtml");
    RequestContext.getCurrentInstance().update("div1");
}

}

误差

19:38:08,978 INFO  [stdout] (default task-14) *****BEFORE **** RESTORE_VIEW 
   19:38:08,985 INFO  [stdout] (default task-14) *****AFTER **** RESTORE_VIEW
   19:38:08,986 SEVERE [javax.enterprise.resource.webcontainer.jsf.context]     
   (default task-14) javax.faces.view.facelets.TagAttributeException:   
   /index.xhtml @33,62
   <ui:include src="#{exceptionPF.srcPage}"> Invalid path : wrong.xhtml
        at com.sun.faces.facelets.tag.ui.IncludeHandler.apply(IncludeHandler.jav

当是视图本身引起异常时,没有办法从视图端处理异常。

您可以使用ViewDeclarationLanguage#viewExists()来检查给定视图是否存在。您应该在设置srcPage之前这样做,如果有必要,可以在单独的(布尔)变量中获取错误的值。

下面是您如何以实用程序方法的形式使用它:

public static boolean viewExists(String viewId) {
    FacesContext context = FacesContext.getCurrentInstance();
    return context.getApplication().getViewHandler()
        .getViewDeclarationLanguage(context, viewId).viewExists(context, viewId);
}

相关内容

  • 没有找到相关文章

最新更新