這兩個選項都不是Spring開發人員的理想選擇, <error-page>元素往往過于簡化,并且很難將Spring概念(例如依賴項注入)與自定義ExceptionHandler一起使用 。 幸運的是,JSF和Spring都是這么一個非常可擴展的框架項目 ,我一直在努力整合這些技術可以提供一些引人注目的替代品。
第一個可用選項允許ExceptionHandler被注冊為Spring Bean。 可以使用新的org.springframework.springfaces.exceptionhandler.ExceptionHandler接口,而不是使用現有的javax.faces.context.ExceptionHandler類。 該接口非常簡單,它定義了一個單一的handle方法,如果已經處理了異常,則該方法應該返回true 。 該接口使用泛型來限制所考慮的異常類型。
public interface ExceptionHandler<E extends Throwable> {boolean handle(E exception, ExceptionQueuedEvent event) throws Exception;
}
當JSF發生異常時,將查詢實現ExceptionHandler接口的所有相關bean。 返回true的第一個處理程序將“獲勝”,隨后的處理程序將不會被調用。 如果需要對處理程序進行排序,則可以使用org.springframework.core.Ordered接口或@Ordered批注。 當然,既然異常處理程序是常規的Spring Bean,則可以使用所有標準的Spring功能,例如依賴項注入和AOP。
現在我們有了基本的異常處理程序掛鉤,我們可以繼續提供一些有用的實現:
有時,處理某些異常的最佳方法是僅顯示一條消息并保留在當前屏幕上。 例如,假設搜索查詢范圍太廣時服務會拋出TooManyResultsException 。 一條簡單的消息告訴用戶“使用更精確的條件重試”可能是唯一需要的異常處理。 org.springframework.springfaces.exceptionhandler.ObjectMessageExceptionHandler類建立在將對象映射到消息的先前工作的基礎上。 在Spring MessageSource中包含一個帶有Exception的全限定名稱的項作為鍵,如果拋出該異常,將顯示FacesMessage 。
com.mycorp.search.TooManyResultsException=Too many results found, please try again with more precise search terms
您可以輕松地將任意數量的異常映射到消息,甚至可以使用消息字符串中的' {property} '占位符來引用異常的屬性 。 可以使用標準JSF技術(通常是<h:messages />組件)在屏幕上顯示消息 。
快速將異常映射到消息的支持很好,但是對于許多應用程序來說,這還不夠,編寫ExceptionHandler bean可能很快就變得很麻煩。 最后一個可選的是org.springframework.springfaces.mvc.exceptionhandler.DispatcherExceptionHandler 。 DispatcherExceptionHandler在JSF和Spring MVC之間提供了一個橋梁,使您可以像在其他任何Spring MVC應用程序中一樣在@Controller中使用@ExceptionHandler批注。 用@ExceptionHandler注釋的方法實際上是通用的,并且可以具有非常靈活的簽名。 您可以直接處理異常或返回應呈現的視圖:
@ExceptionHandler
public String handle(ExampleException e) {return 'redirect:errorpage';
}
在Spring MVC中使用@ExceptionHandler批注是很自然的選擇,并且有很多關于該主題的文章 。 希望現有的JSF開發人員將發現Spring MVC編程風格是標準JSF的有吸引力的替代方案。
請查看本系列的其他文章 ,如果您想檢查異常處理代碼,那么“ org.springframework.springfaces.exceptionhandler”和“ org.springframework.springfaces.mvc.exceptionhandler”軟件包是一個很好的起點。 。
參考: Phil Webb博客博客中我們JCG合作伙伴 Phillip Webb的Spring和JavaServer Faces集成:異常處理 。
翻譯自: https://www.javacodegeeks.com/2012/07/spring-jsf-integration-exception.html