1. 程式人生 > >SpringMVC 註解(五) @ControllerAdvice,@ExceptionHandler 異常處理

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() {
    }
}