SpringMVC中怎么實(shí)現(xiàn)異常處理,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
創(chuàng)新互聯(lián)建站是創(chuàng)新、創(chuàng)意、研發(fā)型一體的綜合型網(wǎng)站建設(shè)公司,自成立以來公司不斷探索創(chuàng)新,始終堅(jiān)持為客戶提供滿意周到的服務(wù),在本地打下了良好的口碑,在過去的十載時(shí)間我們累計(jì)服務(wù)了上千家以及全國政企客戶,如成都搬家公司等企業(yè)單位,完善的項(xiàng)目管理流程,嚴(yán)格把控項(xiàng)目進(jìn)度與質(zhì)量監(jiān)控加上過硬的技術(shù)實(shí)力獲得客戶的一致稱贊。
用于同一個(gè) Controller 類下面方法異常捕獲,先看@ExceptionHandler源碼:
//該注解作用對(duì)象為方法 @Target({ElementType.METHOD}) //在運(yùn)行時(shí)有效 @Retention(RetentionPolicy.RUNTIME) @Documented public @interface ExceptionHandler { //value()可以指定異常類 Class extends Throwable>[] value() default {}; }
異常參數(shù)可以包括一般的異?;蜃远x異常,如果注解沒有指定異常類,會(huì)默認(rèn)進(jìn)行映射。
@Controller public class XttblogController { //自定義異常處理的方法 @ExceptionHandler({Exception.class}) public void exception(Exception e) { system.out.println("發(fā)生了異常") } //業(yè)務(wù)方法 @RequestMapping("test") public void test() { throw new NullPointerException(); } }
當(dāng)業(yè)務(wù)方法發(fā)生異常時(shí),會(huì)自動(dòng)捕獲該異常并調(diào)用該類中的異常處理方法。
@controlleradvice 注解適用于捕獲全局異常,通過@controlleradvice加上@ExceptionHandler可以定義全局異常處理方法。官方也推薦用這種方式處理統(tǒng)一全局異常。
@ControllerAdvice public class MyExceptionHandler extends ResponseEntityExceptionHandler{ @ExceptionHandler(BusinessException.class) @ResponseBody public resultType businessExceptionHandler(BusinessException e){ .... return resultType; } @ExceptionHandler(NullPointException.class) @ResponseBody public resultType exceptionHandler(Exception e){ .... return resultType; } }
通過這樣可以掌控全局異常,當(dāng)業(yè)務(wù)處理發(fā)生異常時(shí),會(huì)自動(dòng)捕獲并調(diào)用相應(yīng)的異常處理方法。建議繼承ResponseEntityExceptionHandler來處理,該父類包括了很多已經(jīng)被@ExceptionHandler注解標(biāo)識(shí)的方法。另外,如果統(tǒng)一異常處理都需要返回json,那么可以使用@RestControllerAdvice注解來代替@ControllerAdvice,這樣就可不需要添加@ResponseBody。
HandlerExceptionResolver是Spring提供的一個(gè)接口。它也可以用來處理全局異常。異常處理類需要實(shí)現(xiàn)該接口,并作為組件@Component交給Spring管理
@Component public class ExceptionResolver implements HandlerExceptionResolver{ @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { var mv = new ModelAndView(); mv.addObject("message","哎呀,一不小心出錯(cuò)了呀!"); mv.setViewName("message"); return mv; } }
HandlerExceptionResolve 雖然能夠處理全局異常,但是 Spring 官方不推薦使用它。
ErrorController是一個(gè)接口,@controlleradvice只能處理進(jìn)入@Controller標(biāo)識(shí)后產(chǎn)生的異常,有時(shí)例如URL地址錯(cuò)誤這種異常處理,就需要異常處理類實(shí)現(xiàn) ErrorController來處理。
@Controller public class InterfaceErrorController implements ErrorController { @Override public String getErrorPath() { return "/error"; } /** * 處理來自web頁面的錯(cuò)誤 */ @RequestMapping(value=“/error”,produces="text/html") @ResponseBody public resultType errorPageHandler(HttpServletRequest request,HttpServletResponse response) { return resultType; } /** * 處理除web頁面外的錯(cuò)誤處理,比如json/xml等 */ @RequestMapping(value="/error") @ResponseBody public resultType errorApiHander(HttpServletRequest request) { return resultType; } }
看完上述內(nèi)容,你們掌握SpringMVC中怎么實(shí)現(xiàn)異常處理的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!