Spring统一处理异常
异常,一大糟心的玩意,今天学会了spring利用注解进行统计的异常处理,超级舒服。
大纲
- 就是这样哈,我们直接给Controller配一个配置类。就能统一起来一起解决异常,为什么呢
- 因为我们是视图层访问业务层 , 业务层访问数据层, 后面的会将异常向上面抛出,所有最后都会聚在 controller视图层
- 然后我们需要准备两个网页, 就是 404 和 500 的网页,直接放在template下面的 error 文件里面即可,发生错误的时候,就可以自动的调用它了
搞个请求挑战,方便后面的复用
@RequestMapping(value = "/error",method = RequestMethod.GET)
public String getErrorPage(){
return "/error/500";
}
- 然后我们就可以编写controller配置类了
@ControllerAdvice(annotations = Controller.class)
public class ExceptionAdvice {
private static final Logger logger = LoggerFactory.getLogger(ExceptionAdvice.class);
@ExceptionHandler({Exception.class})
public void HandleException(Exception e, HttpServletResponse response, HttpServletRequest request) throws IOException {
logger.error("服务器发生异常:" + e.getMessage());
for (StackTraceElement element : e.getStackTrace()) {
logger.error(element.toString());
}
// 判断请求是普通请求还是异步请求
String xRequestedWith = request.getHeader("x-requested-with");
if("XMLHttpRequest".equals(xRequestedWith)){ // 表示这是一个异步请求
response.setContentType("application/plain;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.write(CommunityUtil.getJSONString(0,"服务器异常!!!"));
}else {
response.sendRedirect(request.getContextPath() + "/error");
}
}
}
- 当然,也要进行记录日志的哈。
- 如果发生的路径不存在或者丢失的异常我们就直接跳转到 404 网页上面去。
- 当发生服务器异常的时候,这个地方就会有两种情况了,
- 一种是普通的网络请求,我们直接给出 500 网页的展示, 服务器发生了异常。
- 另一种就是异步请求,这种请求,我们只需要返回一个字符串即可,
- 可以使用以上方式进行
- 这样,整个项目的异常都会在这一个配置类里面得到解决。