springboot统一异常处理
一、注解@ControllerAdvice
- 用于修饰类,表示该类是Controller的全局配置类
- 在此类中,可以对Controller进行如下三种全局配置:
**异常处理方案、绑定数据方案、绑定参数方案**
二、注解@ExceptionHandler
- 用于修饰方法,该方法会在Controller出现异常后被调用,用于处理捕获到的异常
三、注解@ModelAttribute
- 用于修饰方法,该方法会在Controller方法执行前被调用,用于Model对象绑定数据
四、注解@DataBinder
- 用于修饰方法,该方法会在Controller方法执行前被调用,用于绑定参数的转换器
五、举例:
5.1创建异常页面:
在resources目录下的templates下创建error目录,并创建一个404.html页面和500.html页面。如图:
5.2controller包下创建ExceptionAdvice.java
//annotations = Controller.class:只扫描Controller注解的bean
@ControllerAdvice(annotations = Controller.class)
public class ExceptionAdvice {
private static final Logger logger = LoggerFactory.getLogger(ExceptionAdvice.class);
@ExceptionHandler({Exception.class})
public void handleException(Exception e, HttpServletRequest request, HttpServletResponse response) throws IOException {
logger.error("服务器发送异常:"+e.getMessage());
for(StackTraceElement element:e.getStackTrace()){
logger.error(element.toString());
}
// 获取请求方式(普通请求还是异步请求ajax)
String xRquestedWith = request.getHeader("x-requested-with");
if("XMLHttpRequest".equals(xRquestedWith)){
//当请求为ajax异步请求的时候设置响应类型
response.setContentType("application/plain;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.write("服务器异常!");
}else {
//如果是普通请求则请求转发到错误500页面
response.sendRedirect(request.getContextPath()+"/error");
}
}
}
5.4编写500错误跳转接口
@RequestMapping("/error")
public String getErrorPage(){
return "/error/500";
}
5.4测试
启动项目,浏览器输入一个不存在的接口:http://localhost:8080/user/addd自动跳转到404错误页面