SpringMVC 註解(五) @ControllerAdvice,@ExceptionHandler 異常處理
SpringMVC 註解(五) @ControllerAdvice,@ExceptionHandler
1. ExectionHandler
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface ExceptionHandler { /** * Exceptions handled by the annotated method. If empty, will default to any * exceptions listed in the method argument list. */ Class<? extends Throwable>[] value() default {}; }
說明:
註解的範圍:只能註解在方法上
儲存時間: 保留到程式執行時,因此在程式執行時,可以通過反射獲取帶有特定註解的方法
如果使用javadoc 等文件工具,註解的方法會新增到生成的文件中
作用:
定義一個類的異常處理
當在一個方法上註解@ExceptionHandler(異常.class) 時,類中所有方法出現括號中的異常時會自動執行被註解的方法,提供友好檢視, 一個類中可以在多個方法上加上@ExceptionHandler,一個ExceptionHandler 註解可以設定多個異常的處理到一個方法,但是隻對本類中出現的異常進行捕獲
例子:
如圖所示,這個正常的controller,當在瀏覽器中輸入 專案名/test/test 會進入test方法,但是test會執行獲得type引數的操作,當沒傳值時就出現NullPointExceptino ,此時方法會自動跳轉執行error ,向前臺返回設定的內容或檢視
package com.controller; import com.util.TestServiceFactory; import com.util.TypeEnum; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import com.service.TestService; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @Controller @RequestMapping(value = "test") public class TestController { @Autowired TestServiceFactory testServiceFactory; private TestService testService; @ResponseBody @RequestMapping("test") public String test(HttpServletRequest request, HttpServletResponse response){ String type = request.getParameter("type"); testService = getTestService(type); return testService.test(); } @ExceptionHandler(NullPointerException.class) @ResponseBody public String error() { return "請輸入必須引數"; } }
2 . @ControllerAdvice
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface ControllerAdvice {
說明:
定義在類或列舉或介面上
保留時間: 在程式執行時仍然保留
會顯示在文件中
@Component 表明spring會把這個註解標記的類,自動注入servlet上下文
作用:
定義全域性的異常處理
如果一個異常,不僅僅可能會在一個類出現,而是會在多個類中出現,比如NullPointException, 這個時候如果我們要捕獲異常,就要在每個類中定義一個被@ExceptionHandler 註解的方法處理,重複且麻煩,用@ControllerAdvice 和 @ExceptionHandler 組合就捕獲全域性異常
例子:
說明:這樣在註解了@ControllerAdvice 的類上就可以定義全域性異常,不用在每個類中分別定義
注意: 如果某個Controller類中已經定義了某個異常的處理,而註解了@ControllerAdvice的類中也定義這個異常的處理方法,會優先使用Controller類中的定義處理方法
package com.controller;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
@ControllerAdvice
public class ExceptionAdvice {
@ExceptionHandler(NullPointerException.class)
@ResponseBody
public String errro() {
return "失敗,請重試";
}
}
結合@ResponseStatus 使用,返回錯誤檢視和httpcode
@ControllerAdvice
public class ExceptionAdvice {
@ExceptionHandler(NullPointerException.class)
@ResponseStatus(code = HttpStatus.BAD_REQUEST,reason = "失敗請重試")
public void errro() {
}
}