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