常用的 SpringMVC 異常處理方式主要有三種:
使用系統定義好的異常處理器 SimpleMappingExceptionResolver
使用自定義異常處理器
使用異常處理注解
該方式只需要在 SpringMVC 配置文件中注冊該異常處理器 Bean 即可。該 Bean 比較特殊,沒有 id 屬性,無需顯式調用或被注入給其它,當異常發生時會自動執行該類。
項目:simpleMappingExceptionResolver。在項目 receiveParameters-property 上修改。
自定義異常類
定義三個異常類:NameException、AgeException、StudentException。其中 StudentException 是另外兩個異常的父類。
● exceptionMappings:Properties 類型屬性,用于指定具體的不同類型的異常所對應的異常響應頁面。Key 為異常類的全限定性類名,value 則為響應頁面路徑
● defaultErrorView:指定默認的異常響應頁面。若發生的異常不是 exceptionMappings 中指定的異常,則使用默認異常響應頁面。
● exceptionAttribute:捕獲到的異常對象。一般異常響應頁面中使用。
在 WebRoot 下新建一個目錄 errors,在其中定義三個異常響應頁面。
使用 SpringMVC 定義好的 SimpleMappingExceptionResolver 異常處理器,可以實現發生指定異常后的跳轉。但若要實現在捕獲到指定異常時,執行一些操作的目的,它是完成不了的。此時,就需要自定義異常處理器。
自定義異常處理器,需要實現HandlerExceptionResolver接口,并且該類需要在SpringMVC配置文件中進行注冊。
項目:customExceptionResolver。在項目simpleMappingExceptionResolver 上修改。
當一個類實現了 HandlerExceptionResolver 接口后,只要有異常發生,無論什么異常,都會自動執行接口方法 resolveException()
使用注解@ExceptionHandler 可以將一個方法指定為異常處理方法。該注解只有一個可選屬性 value,為一個 Class數組,用于指定該注解的方法所要處理的異常類,即所要匹配的異常。
而被注解的方法,其返回值可以是 ModelAndView、String,或 void,方法名隨意,方法參數可以是 Exception 及其子類對象、HttpServletRequest、HttpServletResponse 等。系統會自動為這些方法參數賦值。
對于異常處理注解的用法,也可以直接將異常處理方法注解于 Controller 之中。
不過,一般不這樣使用。而是將異常處理方法專門定義在一個類中,作為全局的異常處理類。需要使用注解@ControllerAdvice , 字面理解就是“控制器增強” ,是給控制器對象增強功能的。使用@ControllerAdvice 修飾的類中可以使用@ExceptionHandler。
當使用@RequestMapping 注解修飾的方法拋出異常時,會執行@ControllerAdvice 修飾的類中的異常處理方法。
@ControllerAdvice 是使用@Component 注解修飾的,可以 掃描到@ControllerAdvice 所在的類路徑(包名),創建對象。
項目:annotationExceptionResolver。在項目 customExceptionResolver 上修改。