當SpringMVC的Controller出現異常(Exception)時,如何作到及時處理(跳轉錯誤頁面)

當SpringMVC的Controller出現異常時,如何作到及時處理呢?對用於來講比較友好的處理方法就是當出現不一樣的異常時給予不一樣的錯誤提示頁面。html

在代碼實現上,這裏藉助@ControllerAdvice@ExceptionHandler來實現。前端

首先介紹實現過程,而後再對上述標籤作出解釋app

1、實現過程this

/** 經過下面的代碼實現,全部其餘Controller中使用了@RequestMapping註解的方法,在運行過程當中拋出異常時就會獲得相應的處理。 */
@ControllerAdvice
public class ValidateMsgConfig {
    private final Log log = LogFactory.getLog(this.getClass());
    
    /** 當出現業務異常時,將自定義異常類CustomError的內容返回並顯示到頁面上 */
    @ExceptionHandler(BusinessException.class)
    @ResponseBody
    public CustomError handleBusinessException(BusinessException e) {
        log.error(e.getMessage(), e);
        return new CustomError();
    }

    /** 當出現其餘異常時,將跳轉到自定義的錯誤頁面 */
    @ExceptionHandler(OtherException.class)
    public String handleException(Exception e) {
        log.error(e.getMessage(), e);
        return "/common/index/500.html";
    }
}

2、標籤解釋spa

@ControllerAdvicehtm

這個註解新增於Spring3.2版本中。對象

首先這個註解只能使用在類、接口或枚舉類型之上(由於它的@Target設置成了ElementType.TYPE),而且使用了這個註解的類也就成了Spring容器中的一個Bean(由於這個主機擁有@Component註解的功能)。接口

它的做用就是協助其餘普通Controller完成一些輔助功能。比較典型的用途就是在使用了@ExceptionHandler/@InitBinder/@ModelAttribute和@RequestMapping註解的方法上起到必定的做用,具體起到什麼做用呢?其實就是@ExceptionHandler/@InitBinder/@ModelAttribute這3個註解起到的做用(@RequestMapping都比較熟悉,就不講了),下面會說到@ExceptionHandler、@InitBinder和@ModelAttribute的做用。ci

在這個註解中可使用basePackages、value、basePackageClasses這樣的selector對所要做用的Controller限定範圍,若是不加這些selector,則@ControllerAdvice將做用於全部的Controller之上。get

@ExceptionHandler

這個註解在String3.0中新增長,只能使用在方法上。做用是:經過指定具體的異常處理類或異常處理方法進行異常處理。

經過在方法上使用該註解,這些方法的參數中可使用以下類型的參數:Exception、Request、Response、Session、WebReqeust/NativeWebRequest、Locale、InputStream、Reader、OutputStream、Writer、Model。方法的返回值類型可使用以下類型:ModelAndView、Model、Map、View、String、HttpEntity、ResponseEntity、void。

@InitBinder

這個註解在String2.5中新增長,只能使用在方法上。做用是:初始化方法中的WebDataBinder參數,WebDataBinder的做用是完成表單字段到JavaBean屬性的綁定。

使用該註解的方法支持全部RequestMapping支持使用的參數,除命令/表單對象以及相應的校驗結果對象以外。另外,使用該註解的方法不容許有返回值,返回值類型通常都爲void。

注意這個註解須要和RequestMapping配合使用。

@ModelAttribute

這個註解在String2.5中新增長,能使用在方法或參數上。做用:若是該註解做用在方法參數上(注意:這個方法必定是使用了@RequestMapping的方法哦),則會將該參數值綁定到Model對象中;若是該註解做用在方法上(注意:這個方法也必定是使用了@RequestMapping的方法哦),則會將方法返回值綁定到Model對象中,最後將Model對象返回到頁面上。注意這個註解須要和Controller中的帶有RequestMapping註解的方法配合使用。

注意:若是在請求過程當中發生了異常,那麼這些被放入Model中的數據是沒法在前端頁面接收的。

相關文章
相關標籤/搜索