Spring boot 使用@RestControllerAdvice、@ExceptionHandler处理全局请求异常

@RestControllerAdvice
public class ExceptionHandlerController {
    @ExceptionHandler
    public JsonContent handler(Exception exception) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder
                .getRequestAttributes();
        HttpServletResponse response = attributes.getResponse();
        exception.printStackTrace();
        if (exception instanceof BizException) {
            return JsonContent.error(((BizException) exception).getCode(), exception);
        }
        if (exception instanceof PersistenceException) {
            return JsonContent.error("数据库操作失败,请联系管理员");
        }
        if(exception instanceof TokenException){
            response.setStatus(401);

            return JsonContent.error(exception.getMessage());
        }
        if (exception instanceof MethodArgumentNotValidException) {
            if (((MethodArgumentNotValidException) exception).getBindingResult().getFieldErrors().size() > 0) {
                String field = ((MethodArgumentNotValidException) exception).getBindingResult().getFieldErrors().get(0).getField();
                String defaultMessage = ((MethodArgumentNotValidException) exception).getBindingResult().getFieldErrors().get(0).getDefaultMessage();
                return JsonContent.error(500, new BizException(500, field + defaultMessage));
            }
            return JsonContent.error(500, exception);
        }
        if (exception.getCause() instanceof JsonMappingException) {
            return JsonContent.error("参数错误,请检查输入的参数");
        } else if (exception instanceof MultipartException) {
            response.setStatus(500);
            if ((((MultipartException) exception).getRootCause()) instanceof FileUploadBase.FileSizeLimitExceededException) {
                return JsonContent.error("上传失败:请上传小于300M的文件");
            } else {
                return JsonContent.error("上传失败,请联系管理员");
            }
        }  else if(exception instanceof TradeException){
            return JsonContent.error(((TradeException) exception).getCode(), exception);
        }  else if(exception instanceof DuplicateKeyException){
            String pattStr = "(?<=\').*?(?=\')";
            //创建Pattern并进行匹配
            Pattern pattern= Pattern.compile(pattStr);
            Matcher m=pattern.matcher(exception.getMessage());
            String s="";
            while(m.find()){
                s=m.group();
                break;
            }
            return JsonContent.error("【"+s+"】"+"数据已被占用");
        }

        String errorMsg = exception.getMessage();

        if (UtilsString.isBlank(errorMsg)) {
            errorMsg = "系统异常,请联系管理员!";
        }

        return JsonContent.error(errorMsg);
    }
}

如果在项目里还使用了@Around,通过try_catch方式处理异常,全局异常不会生效。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值