springboot 项目之默认全局异常拦截

在web项目中,不可避免地会出现系统异常,例如资源找不到的404错误,服务器异常的5**错误,如果对这些异常不进行任何处理,则是非常不友好的。今天就对springboot项目中的异常拦截处理进行一个简单的使用说明。这里我使用的是springboot默认的异常拦截,也就是新建一个BasicErrorController类继承BasicErrorController。

默认异常拦截

在springboot项目中,不管是404错误还是其他错误,浏览器访问的时候,都会抛出一个非常不友好的异常,如下

springboot 项目之默认全局异常拦截_第1张图片

如果在客户端(非ajax)请求,则会返回一个json对象,如下

springboot 项目之默认全局异常拦截_第2张图片

这样的异常是非常不友好的,接下来我们需要来对异常进行加工处理。

thymeleaf定制化页面

这里使用thymeleaf模板来新建页面。在pom中添加依赖即可。

  
            org.springframework.boot
            spring-boot-starter-thymeleaf
            2.4.1
  

新建一个继承BaseErrorController的类

在项目下新建一个error(可任意)包,新建一个继承BaseErrorController的类。如下

springboot 项目之默认全局异常拦截_第3张图片

 

springboot 项目之默认全局异常拦截_第4张图片

BaseErrorController里面有对异常进行拦截,我们可以进入到该类的源码中查看

springboot 项目之默认全局异常拦截_第5张图片

 

springboot 项目之默认全局异常拦截_第6张图片

可以看到在errorHtml()中返回了异常页面,在error()中返回了postman(非ajax)请求。

那么我们自定义的类继承该类写这两个方法,就可以实现异常的自定义拦截

package meicius.ori.error;
import org.springframework.boot.autoconfigure.web.ErrorProperties;
import org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController;
import org.springframework.boot.web.servlet.error.DefaultErrorAttributes;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.ModelAndView;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;
 
@Controller
public class MyBasicErrorController extends BasicErrorController {
   
    public MyBasicErrorController() {
        super(new DefaultErrorAttributes(), new ErrorProperties());
    }
 
    @Override
    protected Map getErrorAttributes(HttpServletRequest request, boolean includeStackTrace) {
        return super.getErrorAttributes(request, includeStackTrace);
    }
 
    @Override
    public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) {
        ModelAndView modelAndView = super.errorHtml(request, response);
        String httpStatus = modelAndView.getModel().get("status").toString();
        if(httpStatus.equals("404")){
            modelAndView.setViewName("/error/404");
            return modelAndView;
        }
        Map stringObjectMap = getErrorAttributes(request, true);
        modelAndView.addObject("stackTrace", stringObjectMap.get("trace").toString());
        modelAndView.setViewName("/error/error");
        return modelAndView;
    }
    @Override
    public ResponseEntity> error(HttpServletRequest request) {
        Map body = getErrorAttributes(request,isIncludeStackTrace(request, MediaType.TEXT_HTML));
        Map bodyRes = new HashMap();
        bodyRes.put("message", "异常拦截");
        bodyRes.put("data", body);
        HttpStatus status = getStatus(request);
        return new ResponseEntity>(bodyRes, status);
    }
}

代码中重写了errorHtml() 和 error()

errorHtml()方法

在该方法中,我做了一个404错误和非404错误的判断,如果是404错误,则会返回一个定制化的页面,只有一张图片。如果是非404错误,则会返回相关的错误信息。在templates中建立error文件夹,在该文件夹下面放抛出异常的页面

error.html




    Spring Boot ori统一异常拦截
    
    


    
           

404页面




    Spring Boot ori统一异常拦截
    
    


    

其中404.html页面引入了一张图片,图片放在static下面。整个目录如下

springboot 项目之默认全局异常拦截_第7张图片

这样就完成了ajax请求的异常拦截

springboot 项目之默认全局异常拦截_第8张图片

springboot 项目之默认全局异常拦截_第9张图片

error()

error()方法里面是对非ajax请求的处理,例如使用postman请求

springboot 项目之默认全局异常拦截_第10张图片

至此,springboot默认全局异常处理就完成了。这种方式不仅可以获取到异常的接口路径、错误状态、错误代码、还可以获取到堆栈日志等信息。

你可能感兴趣的:(java,spring,spring,boot,后端)