溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringMVC中怎么實現異常處理

發布時間:2021-07-30 14:30:26 來源:億速云 閱讀:169 作者:Leah 欄目:大數據

SpringMVC中怎么實現異常處理,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

@ExceptionHandler、@controlleradvice、HandlerExceptionResolver、ResponseEntityExceptionHandler、ErrorController

    1.@ExceptionHandler注解

用于同一個 Controller 類下面方法異常捕獲,先看@ExceptionHandler源碼:

//該注解作用對象為方法
@Target({ElementType.METHOD})
//在運行時有效
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ExceptionHandler {
    //value()可以指定異常類
    Class<? extends Throwable>[] value() default {};
}

異常參數可以包括一般的異?;蜃远x異常,如果注解沒有指定異常類,會默認進行映射。

@Controller
public class XttblogController {
    
    //自定義異常處理的方法
    @ExceptionHandler({Exception.class})
    public void exception(Exception e) {
        system.out.println("發生了異常")
    }

    //業務方法
    @RequestMapping("test")
    public void test() {
        throw new NullPointerException();
    }
}

當業務方法發生異常時,會自動捕獲該異常并調用該類中的異常處理方法。

    2. @controlleradvice注解

@controlleradvice 注解適用于捕獲全局異常,通過@controlleradvice加上@ExceptionHandler可以定義全局異常處理方法。官方也推薦用這種方式處理統一全局異常。

@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;
    }
}

通過這樣可以掌控全局異常,當業務處理發生異常時,會自動捕獲并調用相應的異常處理方法。建議繼承ResponseEntityExceptionHandler來處理,該父類包括了很多已經被@ExceptionHandler注解標識的方法。另外,如果統一異常處理都需要返回json,那么可以使用@RestControllerAdvice注解來代替@ControllerAdvice,這樣就可不需要添加@ResponseBody。

    3.HandlerExceptionResolver接口

HandlerExceptionResolver是Spring提供的一個接口。它也可以用來處理全局異常。異常處理類需要實現該接口,并作為組件@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","哎呀,一不小心出錯了呀!");
        mv.setViewName("message");
        return mv;
    }
}

HandlerExceptionResolve 雖然能夠處理全局異常,但是 Spring 官方不推薦使用它。

    4.ErrorController

ErrorController是一個接口,@controlleradvice只能處理進入@Controller標識后產生的異常,有時例如URL地址錯誤這種異常處理,就需要異常處理類實現 ErrorController來處理。

@Controller
public class InterfaceErrorController implements ErrorController {
    
    @Override
    public String getErrorPath() {
        return "/error";
    }
 
    /**
     * 處理來自web頁面的錯誤
     */
    @RequestMapping(value=“/error”,produces="text/html")
    @ResponseBody
    public resultType errorPageHandler(HttpServletRequest request,HttpServletResponse response) {
        return resultType;
    }
 
    /**
     * 處理除web頁面外的錯誤處理,比如json/xml等
     */
    @RequestMapping(value="/error")
    @ResponseBody
    public resultType errorApiHander(HttpServletRequest request) {
        return resultType;
    }
}

看完上述內容,你們掌握SpringMVC中怎么實現異常處理的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女