Обработка исключения TagAttributeException и изменение ui:includeSrc

У нас есть элементы динамического меню на странице и ссылки для include-source .xhtml, хранящиеся в БД, в этом сценарии, если исходный xhtml введен неправильно или не удалось найти контекст приложения, он выдает TagAttributeException с сообщением Invalid Path.

После этого события, если мы делаем какой-либо 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

person Balaji    schedule 26.05.2015    source источник


Ответы (1)


Невозможно обработать исключение со стороны представления, когда само представление вызывает исключение.

Вы можете использовать ViewDeclarationLanguage#viewExists(), чтобы проверить, существует ли данное представление. Вы должны сделать это перед установкой srcPage и при необходимости получить неправильное значение в отдельной (логической) переменной.

Вот как вы можете использовать его в качестве служебного метода:

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