SpringBoot中Rest接口全局异常处理

@Slf4j
@RestControllerAdvice
public class RestExceptionAdvice {

    @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
    public Result httpRequestMethodNotSuppertedException(HttpRequestMethodNotSupportedException ex, HttpServletResponse response, HttpServletRequest request) {
        log.error(LogMark.format(BusinessExceptionConstants.REST_EXCEPTION, "httpRequestMethodNotSuppertedException"), ex);
        response.setStatus(HttpStatus.NOT_FOUND.value());
        return Result.error(HttpStatus.NOT_FOUND.value(), "请求路径错误或者请求方式错误(method)");
    }


    @ExceptionHandler(NoHandlerFoundException.class)
    public Result noHandlerFoundException(NoHandlerFoundException ex, HttpServletRequest request , HttpServletResponse response) {
        if(request.getMethod().equalsIgnoreCase(RequestMethod.OPTIONS.name())) {
            response.setStatus(HttpStatus.OK.value());
            return Result.ok();
        }
        log.error(LogMark.format(BusinessExceptionConstants.REST_EXCEPTION, "NoHandlerFoundException request url:{},request method:{}"), request.getRequestURI(), request.getMethod(), ex);
        response.setStatus(HttpStatus.NOT_FOUND.value());
        return Result.error(HttpStatus.NOT_FOUND.value(), ex.getLocalizedMessage());
    }


    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Result methodArgumentNotValidException(MethodArgumentNotValidException ex, HttpServletResponse response, HttpServletRequest request) {
        BindingResult bindingResult = ex.getBindingResult();
        StringBuilder sbf = new StringBuilder();
        List<ObjectError> errors =  bindingResult.getAllErrors();
        for(ObjectError error: errors) {
            try {
                Field field  = error.getClass().getDeclaredField("field");
                field.setAccessible(true);
                sbf.append(field.get(error)).append(" ").append(error.getDefaultMessage()).append(";");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        log.error(LogMark.format(BusinessExceptionConstants.REST_EXCEPTION, "MethodArgumentNotValidException request url:{},request method:{}"), request.getRequestURI(), request.getMethod(), ex);
        response.setStatus(HttpStatus.BAD_REQUEST.value());
        return Result.error(HttpStatus.BAD_REQUEST.value(), sbf.toString());
    }


    @ExceptionHandler(NullPointerException.class)
    public Result nullPointerException(Exception ex, HttpServletResponse response, HttpServletRequest request) {
        log.error(LogMark.format(BusinessExceptionConstants.REST_EXCEPTION,"nullPointerException request url:{},request method:{}"), request.getRequestURI(), request.getMethod(), ex);
        response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
        return Result.error(HttpStatus.INTERNAL_SERVER_ERROR.value(), ex.getMessage());
    }

    @ExceptionHandler(CommonMsgException.class)
    public Result msgException(CommonMsgException ex, HttpServletResponse response, HttpServletRequest request) {
        log.error(LogMark.format(BusinessExceptionConstants.REST_EXCEPTION, "commonMsgException request url:{},request method:{}"), request.getRequestURI(), request.getMethod(), ex);
        response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
        return Result.error(HttpStatus.INTERNAL_SERVER_ERROR.value(), ex.getMessage());
    }

    @ExceptionHandler(AuthException.class)
    public Result authException(AuthException ex, HttpServletResponse response, HttpServletRequest request) {
        log.error(LogMark.format(BusinessExceptionConstants.REST_EXCEPTION, "AuthException request url:{},request method:{}"), request.getRequestURI(), request.getMethod(), ex);
        response.setStatus(ex.getHttpStatus());
        return Result.error(ex.getResultCode(), ex.getMessage());
    }

    @ExceptionHandler(HttpServerNotSupportException.class)
    public Result tsdbException(HttpServerNotSupportException ex, HttpServletResponse response, HttpServletRequest request) {
        log.error(LogMark.format(BusinessExceptionConstants.TSDB_EXCEPTION, "tsdbException request url:{},request method:{}"), request.getRequestURI(), request.getMethod(), ex);
        response.setStatus(HttpStatus.CONFLICT.value());
        return Result.error(HttpStatus.CONFLICT.value(), ex.getMessage());
    }

    @ExceptionHandler(Exception.class)
    public Result unknownException(Exception ex, HttpServletResponse response, HttpServletRequest request) {
        log.error(LogMark.format(BusinessExceptionConstants.REST_EXCEPTION, "unknownException request url:{},request method:{}"), request.getRequestURI(), request.getMethod(), ex);
        response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
        return Result.error(HttpStatus.INTERNAL_SERVER_ERROR.value(), ex.getMessage());
    }
}

以上java类主要是实现rest接口全局异常的处理,若没有指定特定的异常,再接口调用发生的异常都会走unknownException这个方法,如果想指定特定异常特定处理,比如AuthException,示例代码如下:

@GetMapping("/test")
public Result getLatestData(TokenMessage tokenMessage) {
    if (null == tokenMessage) {
        throw new AuthException(HttpStatus.UNAUTHORIZED.value(), HttpStatus.UNAUTHORIZED.value(), "invalid token");
    }
}

而实现全局接口异常的步骤,首先是要在类上加上注解@RestControllerAdvice,然后在方法上加上注解@ExceptionHandler,如果该注解里加入的方法类为Exception,那么如果接口报错,且报的错为Exception的

子类,那报错处理统一会走这个方法。

ps:有不对的地方,欢迎指导

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值