2015-05-26 14 views
0

У нас есть динамические пункты меню на странице и ссылки для источника-источника .xhtml, хранящиеся в БД, в этом случае, если исходный xhtml ошибочно введен или не найден контекст приложения, который он выбрасывает Сообщение TagAttributeException с сообщением о недопустимом пути.Обращение с тегом TagAttributeException и изменение ui: includeSrc

После этого события, если мы сделаем любой запрос ajax, он не удался, причина в фазе восстановления-просмотра попыталась восстановить с недопустимым xhtml (include 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 

ответ

1

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

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

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

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

Спасибо за ваше решение, он решил наш случай. – Balaji

+0

Добро пожаловать. – BalusC