@ControllerAdvice實現優雅地處理異常

@ControllerAdvice,是Spring3.2提供的新註解,它是一個Controller加強器,可對controller中被 @RequestMapping註解的方法加一些邏輯處理。最經常使用的就是異常處理json

統一異常處理

須要配合@ExceptionHandler使用。
當將異常拋到controller時,能夠對異常進行統一處理,規定返回的json格式或是跳轉到一個錯誤頁面瀏覽器

//全局異常捕捉處理
@ControllerAdvice
public class CustomExceptionHandler {

    @ResponseBody
    @ExceptionHandler(value = Exception.class)
    public Map errorHandler(Exception ex) {
        Map map = new HashMap();
        map.put("code", 400);
        //判斷異常的類型,返回不同的返回值
        if(ex instanceof MissingServletRequestParameterException){
            map.put("msg","缺乏必需參數:"+((MissingServletRequestParameterException) ex).getParameterName());
        }
        else if(ex instanceof MyException){
            map.put("msg","這是自定義異常");
        }
        return map;
    }
}
//自定義異常類
@Data
public class MyException extends RuntimeException {
    private long code;
    private String msg;

    public MyException(Long code, String msg){
        super(msg);
        this.code = code;
        this.msg = msg;
    }

    public MyException(String msg){
        super(msg);
        this.msg = msg;
    }
}
@RestController
public class TestController {
    @RequestMapping("testException")
    public String testException() throws Exception{
        throw new MissingServletRequestParameterException("name","String");
    }

    @RequestMapping("testMyException")
    public String testMyException() throws MyException{
        throw new MyException("i am a myException");
    }
}

分別訪問testExceptiontestMyException接口,可獲得如下結果app

{"msg":"缺乏必需參數:name","code":400}
{"msg":"這是自定義異常","code":400}

若是不須要返回json數據,而要渲染某個頁面模板返回給瀏覽器,那麼能夠這麼實現:學習

@ExceptionHandler(value = MyException.class)
public ModelAndView myErrorHandler(MyException ex) {
    ModelAndView modelAndView = new ModelAndView();
    //指定錯誤頁面的模板頁
    modelAndView.setViewName("error");
    modelAndView.addObject("code", ex.getCode());
    modelAndView.addObject("msg", ex.getMsg());
    return modelAndView;
}

這樣子很方便吧~this

若是以爲不錯,分享給你的朋友!spa

image

image

 THANDKScode

  • End -

一個立志成大腿而天天努力奮鬥的年輕人接口

伴學習伴成長,成長之路你並不孤單!rem

掃描二維碼,關注公衆號

相關文章
相關標籤/搜索