Springboot之统一异常处理
2018-12-23 本文已影响0人
喊我小王吧
Springboot全局异常处理
在开发中经常会遇到一些异常,比如url不正确会产生404页面,获取一些参数,可能出出现一些异常,或者代码不规范莫名其其妙的异常问题,或者网络问题出现的异常。
结果可能会呈现出一些不太友好的页面给用户展示,这时候我们就需要处理一些异常的问题。
好在spring为我们提供了一种处理异常的机制。
SpringBoot 统一异常处理— @ControllerAdvice 使用
注解 @ControllerAdvice 我们可以将对于控制台的全局配置放置在同一个位置,注解了这个ControllerAdvice 的类可以当做一个全局的异常请求器来使用。
@ControllerAdvice 声名一个控制器,并且自动注册为bean ,@ControllerAdvice 结合了@Component注解
还为一些方法提供了一些注解:
@ExceptionHandler 用于全局控制器的方法注解,一般最常用。
@InieBinder 将键值对添加到全局,所有注解@RequestMapping的方法可以获取到
@ModelAttribute 定制WebDataBinder
controller###
我们来自定抛出一个异常,用来模拟异常情况。
@RequestMapping("showUser")
public String showUser(Model model) {
throw new MyException("xx");
}
全局异常处理类###
@ControllerAdvice //声名一个控制器,并且自动注册为bean
public class ExceptionAdvice {
@ExceptionHandler(value = {MyException.class}) // 在此设置全局异常处理,可以通过value过滤请拦截的条件
// @ExceptionHandler // 在此设置全局异常处理,可以通过value过滤请求,默认是全部
public ModelAndView excepetion(MyException e){
ModelAndView mv = new ModelAndView();
mv.addObject("exception",e);
System.out.println("----" + e);
mv.setViewName("error");
return mv;
}
//不常用
@ModelAttribute //将键值对添加到全局
public void addAttributes(Model model){
model.addAttribute("msg","信息");
}
}
异常类:
public class MyException extends RuntimeException {
public MyException(String message) {
super(message);
}
}
页面
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8" />
<title>错误页面</title>
</head>
<body>
错误exception <span th:text="${exception}"> </span>
</body>
</html>
出现异常

获取参数异常
@ExceptionHandler
@ResponseBody
public ErrorData errorData(MyException e){
return new ErrorData("error",e.getMessage(),"0");
}
返回的实体 ErrorData
public class ErrorData {
String data;
String mes;
String code;
public ErrorData(String data, String mes, String code) {
this.data = data;
this.mes = mes;
this.code = code;
}
public Object getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public String getMes() {
return mes;
}
public void setMes(String mes) {
this.mes = mes;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
}
总之不管是跳转页面还是获取出具出现错误,都是最终先请求controller,然后出现异常问题controller抛出异常,再由全局异常处理器进行异常处理,通过自己 注解@ExceptionHandler进行页面跳转异常处理或者获取数据异常处理,返回给异常页面提示或者请求出错后的错误信息!