Spring Boot 全局异常处理(400/404/500),顺便解决过滤器中异常未捕获到的问题,让RestApi 任何时候都能获取统一的格式代码

出发点是为了在系统抛出异常的时候,前端仍然可以获取到统一的报文格式,所以后端所有的异常都得捕获,并处理

Spring boot 在处理异常的时候,500/404默认都会转发到/error,而这个异常的处理类是

ErrorController,所以我们重写一个
ErrorController的子类即可:
@RestController
public class GlobalExceptionController extends AbstractErrorController {
    private static final Logger LOGGER = LoggerFactory.getLogger(GlobalExceptionController.class);
    private static final String ERROR_PATH = "/error";

    public GlobalExceptionController(ErrorAttributes errorAttributes) {
        super(errorAttributes);
    }

    @Override
    public String getErrorPath() {
        return ERROR_PATH;
    }

    @RequestMapping(value = ERROR_PATH)
    public Response error(HttpServletRequest request) {
        WebRequest webRequest = new ServletWebRequest(request);
        Throwable e = getError(webRequest);
        if (e == null) {
            Map<String, Object> attributes = getErrorAttributes(request, false);
            Object timestamp = attributes.get("timestamp");
            Object status = attributes.get("status");
            String error = attributes.get("error").toString();
            Object path = attributes.get("path");
            LOGGER.error("status {} error {} path{} timestamp {}", status, error, path, timestamp);
            return Response.failure(Integer.parseInt(status.toString()), error);
        }
        if (e instanceof TokenExpiredException) {
            TokenExpiredException tokenExpiredException = (TokenExpiredException) e;
            return Response.failure(tokenExpiredException.getHttpStatus().value(), tokenExpiredException.getHttpStatus().getReasonPhrase());
        } else if (e instanceof CodeException) {
            CodeException codeException = (CodeException) e;
            String message = e.getMessage();
            if (StringUtils.isEmpty(message)) {
                message = String.format("[%s][%s]", codeException.getErrCode(), codeException.getErrMsg());
            }
            return Response.failure(message);
        } else {
            return Response.failure("系统繁忙,请稍后再试");
        }
    }

    private Throwable getError(WebRequest webRequest) {
        return (Throwable) this.getAttribute(webRequest, "javax.servlet.error.exception");
    }

    private Object getAttribute(RequestAttributes requestAttributes, String name) {
        return requestAttributes.getAttribute(name, 0);
    }
}

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot,我们可以使用全局异常处理统一处理应用程序发生的异常全局异常处理可以捕获并处理所有的异常,无论是在控制器层还是其他层级抛出的异常。 要实现全局异常处理,可以按照以下步骤进行操作: 1. 创建一个用于处理全局异常的类,可以命名为GlobalExceptionHandler。 2. 在该类上使用@ControllerAdvice注解,以便让Spring Boot知道这是一个全局异常处理器。 3. 在该类定义方法来处理各种类型的异常。这些方法需要使用@ExceptionHandler注解进行标记,并指定要处理的异常类型。 4. 在方法定义处理异常的逻辑,例如返回自定义的错误消息、错误码等。 5. 可以选择将错误消息封装成一个自定义的响应实体类,以便在控制器统一返回该实体类。 以下是一个简单的示例: ```java @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ResponseEntity<ErrorResponse> handleException(Exception ex) { ErrorResponse errorResponse = new ErrorResponse(); errorResponse.setMessage("An error occurred"); errorResponse.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value()); // 其他自定义的错误处理逻辑 return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR); } } ``` 在上述示例,我们使用了Exception.class来处理所有类型的异常。在实际应用,可以根据需要定义多个不同类型的异常处理方法。 需要注意的是,全局异常处理只能处理在Spring容器抛出的异常。如果异常发生在过滤器(Filter)、拦截器(Interceptor)或Servlet,则需要使用其他方式进行处理。 希望以上信息对你有帮助!如果你有更多的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值