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方式处理异常,全局异常不会生效。

你可能感兴趣的:(spring)