@ControllerAdvice,是Spring3.2提供的新註解,它是一個Controller增強器,可對controller中被 @RequestMapping註解的方法加一些邏輯處理。最常用的就是異常處理
統一異常處理
需要配合@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");
}
}
分別訪問testException
和testMyException
接口,可得到以下結果
{"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;
}
這樣子很方便吧~
如果覺得不錯,分享給你的朋友!
THANDKS
- End -
一個立志成大腿而每天努力奮鬥的年輕人
伴學習伴成長,成長之路你並不孤單!