Springboot自定义全局异常处理

简介: BasicErrorController是Spring Boot中默认提供的用于处理基本错误的控制器。它实现了ErrorController接口,用于处理在应用程序中发生的错误,例如404 Not Found等。此种方式是通过请求转发实现的,出现异常时,会转发到请求到/error,该接口对异常进行处理返回,是最符合全局异常处理的。

ErrorController


BasicErrorController是Spring Boot中默认提供的用于处理基本错误的控制器。它实现了ErrorController接口,用于处理在应用程序中发生的错误,例如404 Not Found等。此种方式是通过请求转发实现的,出现异常时,会转发到请求到/error,该接口对异常进行处理返回,是最符合全局异常处理的。


项目需要的响应信息都是自定义统一格式的JSON(code、msg、data),因此可以继承ErrorController接口实现异常处理的自定义。


响应实体类:


@Data
@ToString
public class Result<T> implements Serializable {
    private static final long serialVersionUID = 1L;
    //业务码,比如成功、失败、权限不足等 code,可自行定义
    private int resultCode;
    //返回信息,后端在进行业务处理后返回给前端一个提示信息,可自行定义
    private String message;
    //数据结果,泛型,可以是列表、单个对象、数字、布尔值等
    private T data;
    public Result() {
    }
    public Result(int resultCode, String message) {
        this.resultCode = resultCode;
        this.message = message;
    }
}


继承ErrorController接口实现异常处理的自定义,代码如下:


@RestController
public class CustomErrorController implements ErrorController {
    private ErrorAttributes errorAttributes;
    public CustomErrorController(ErrorAttributes errorAttributes) {
        this.errorAttributes = errorAttributes;
    }
    @RequestMapping("/error")
    public Result handleError(HttpServletRequest request) {
        // 获取异常信息
//        Map<String, Object> errorAttributes = this.errorAttributes.getErrorAttributes(new ServletWebRequest(request),true);
        // 获取异常信息的状态码
        Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
        // 获取异常信息的详细信息
        Throwable throwable = (Throwable) request.getAttribute("javax.servlet.error.exception");
        String errorMessage = (throwable != null ? throwable.getMessage() : "Unknown error");
        return new Result(statusCode,errorMessage);
    }
    public String getErrorPath() {
        return "/error";
    }
}

@ControllerAdvice+@ExceptionHandler

继承ErrorController接口实现异常处理的方法,对于自定义业务错误码code不好得到,有时候我们会自定义一些异常信息,比如:


public class AException extends Exception{
    public AException() {
        super();
    }
    public AException(String message) {
        super(message);
    }
}


@ControllerAdvice注解用于声明一个全局控制器建言(advice)。它是一个组件类,专门用于处理全局异常和全局数据绑定。通常,你可以在这个类中定义多个@ExceptionHandler方法,每个方法处理不同类型的异常。代码如下:


@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.OK)
    public Result AException(Exception e, HttpServletRequest request,HttpServletResponse response){
        Result result=new Result();
        result.setResultCode(response.getStatus());
        if(e instanceof AException){
            result.setResultCode(1000);
            result.setMessage("AException error");
        }
        result.setMessage(e.getMessage());
        return result;
    }
}


但是它也有个缺点,就是处理不了过滤器等抛出的异常。因此在全局异常处理方案中,推荐使用ErrorController+@ControllerAdvice+@ExceptionHandler 的实现方案,Controller抛出了异常,被异常处理器(@ControllerAdvice+@ExceptionHandler)首先处理。过滤器抛出异常,由基于请求转发的方式(ErrorController)处理异常。


注意:本人Springboot版本 2.7.12

相关文章
|
1月前
|
JSON 前端开发 Java
【十八】springboot实现自定义全局异常处理
【十八】springboot实现自定义全局异常处理
55 1
【十八】springboot实现自定义全局异常处理
|
11月前
|
Java
SpringBoot自定义异常处理
SpringBoot自定义异常处理
49 1
|
10月前
|
Java 开发者 Spring
Spring Boot 中关于自定义异常处理的套路!
Spring Boot 中关于自定义异常处理的套路!
|
JSON 前端开发 Java
《springboot实战》第六章 实现自定义全局异常处理
《springboot实战》第六章 实现自定义全局异常处理
145 0
|
JSON 前端开发 JavaScript
SpringBoot系列教程web篇之自定义异常处理HandlerExceptionResolver
关于Web应用的全局异常处理,上一篇介绍了ControllerAdvice结合@ExceptionHandler的方式来实现web应用的全局异常管理; 本篇博文则带来另外一种并不常见的使用方式,通过实现自定义的HandlerExceptionResolver,来处理异常状态
455 0
SpringBoot系列教程web篇之自定义异常处理HandlerExceptionResolver
|
安全 Java 数据库
SpringBoot+拦截器+自定义异常+自定义注解+全局异常处理简单实现接口权限管理
提到权限管理这块肯定很多人第一想到的就是Springboot Security或者是Shiro安全框架,但本文介绍的并不是这两种,不是因为他们不好用,实在是自己太懒了,我觉得一个拦截器加上其他的一些处理就能满足项目的需求,我又何必去多用一个框架呢,这篇文章也不是去对比谁好谁坏,各位自行抉择。
84077 6
Springboot自定义异常处理
1.自定义异常类 import lombok.Data; @Data public class UserException extends RuntimeException { private Long id; public UserException(Long id) { super("user not exist"); this.
1487 0
|
JSON Java 测试技术
看看人家 SpringBoot 的全局异常处理,多么优雅。。。
本篇文章主要介绍的是SpringBoot项目进行全局异常的处理。 SpringBoot全局异常准备
看看人家 SpringBoot 的全局异常处理,多么优雅。。。
|
Java 编译器 程序员
SpringBoot全局异常处理
在开发软件系统过程中,异常信息是常见的,如何处理系统内部异常,快速定位BUG,是非常考验一位软件开发人员的功底。在软件系统开发过程中,统一自定义异常信息,统一对异常进行捕获处理,这样做能提高软件开发效率,并且使代码看起来更优雅。
375 0
|
JSON 前端开发 Java
SpringBoot全局异常处理(三十)下
SpringBoot全局异常处理(三十)下
273 0
SpringBoot全局异常处理(三十)下