今天完成的事情
異常統(tǒng)一處理
異常在web開發(fā)中我們是再熟悉不過了迈嘹,沒學(xué)習(xí)spring boot
之前出現(xiàn)異常沒有用一個統(tǒng)一的處理方法摇锋,并且沒有根據(jù)不同的異常來給出不同的提示驾霜,在spring boot 這里如果出現(xiàn)異常會出現(xiàn)下面這個頁面:
spring boot 默認(rèn)錯誤頁面
這個頁面對用戶不是很友好耕餐,因?yàn)殄e誤是什么引起的,用戶不知道旺上。所以需要一個針對不同的異常給出不同的提示信息瓶蚂。下面以一個小demo來演示如何統(tǒng)一處理不同的異常。
1.創(chuàng)建全局異常處理類
- @ControllerAdvice定義統(tǒng)一的異常處理類
- @ExceptionHandler定義針對不同異常的處理方法
- 最后將異常對象和出異常的url映射到erroe.html的錯誤頁面中
package com.baidu.ch8mybatis.exception;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
/**
* @author huangdongjiang
* @date 2018/8/29 22:52
*/
@ControllerAdvice
public class GlobalExceptionHandler {
private static final String DEFAULT_ERROR_VIEM = "error";
@ExceptionHandler(value = Exception.class)
public ModelAndView defaultErrorHandler(HttpServletRequest request, Exception e) {
System.out.println("進(jìn)入異常中心宣吱。窃这。。............................");
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("exception", e);
modelAndView.addObject("url", request.getRequestURL());
modelAndView.setViewName(DEFAULT_ERROR_VIEM);
return modelAndView;
}
}
2.寫一個顯示異常的錯誤頁面:
error.html
<!DOCTYPE html>
<html xmlns:th="http://www.w3.org/1999/xhtml">
<head lang="en">
<meta charset="UTF-8" />
<title>統(tǒng)一異常處理</title>
</head>
<body>
<h1>Error Handler</h1>
<div th:text="${url}"></div>
<div th:text="${exception.message}"></div>
</body>
</html>
3.寫一個Controller來測試一下
package com.baidu.ch8mybatis.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author huangdongjiang
* @date 2018/8/30 0:08
*/
@Controller
public class Hello {
@RequestMapping("/hello")
public String hello() throws Exception {
System.out.println("拋出異常.......................................");
throw new Exception("訪問的頁面忙");
}
}
直接訪問:http://localhost:8080/hello
可以看到效果:(markdown截圖比較麻煩凌节,我就不截自己的錯誤頁面圖了钦听,下面這張圖是在博客的教程直接拿過來的)
image
另外,如果我們做的是RESTful的接口倍奢,那就不能直接返回html頁面,而是返回json格式的數(shù)據(jù)垒棋,那這時應(yīng)該怎么統(tǒng)一處理異常呢卒煞?做法如下:
1.把返回給頁面的信息封裝成一個ErrorInfo對象
package com.baidu.ch8mybatis.exception;
/**
* @author huangdongjiang
* @date 2018/8/30 0:40
*/
public class ErrorInfo<T> {
public static final Integer OK = 0;
public static final Integer ERROR = 100;
private Integer code;
private String message;
private String url;
private T data;
//省略了getter和setter方法
}
2.根據(jù)不同的錯誤自定義異常
package com.baidu.ch8mybatis.exception;
/**
* @author huangdongjiang
* @date 2018/8/30 0:43
*/
public class MyException extends Exception {
public MyException(String message) {
super(message);
}
}
3.在統(tǒng)一異常處理類里面加上我們處理自定義異常的方法,這里跟非RESTful接口不同的地方是在方法上面加上@ResponseBody
注解叼架,讓其返回json格式的數(shù)據(jù)
@ExceptionHandler(value = MyException.class)
@ResponseBody
public ErrorInfo<String> jsonErrorHandler(HttpServletRequest request, MyException e) {
//把錯誤給封裝起來畔裕,返回錯誤對象的json格式數(shù)據(jù)
ErrorInfo<String> r = new ErrorInfo<>();
r.setCode(ErrorInfo.ERROR);
r.setMessage(e.getMessage());
r.setUrl(request.getRequestURL().toString());
r.setData("Some Data");
return r;
}
4.測試
package com.baidu.ch8mybatis.controller;
import com.baidu.ch8mybatis.exception.MyException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author huangdongjiang
* @date 2018/8/30 0:45
*/
@Controller
public class HelloController {
@RequestMapping("/json")
public String json() throws MyException {
throw new MyException("不好衣撬,出錯啦...");
}
}
經(jīng)過測試返回的確是json格式的數(shù)據(jù)
明天計(jì)劃的事情
1.學(xué)下權(quán)限認(rèn)證
遇到的問題
暫無
收獲
如上