From dbfc63d7c83d8b36e84e40f0bc36b449f6ac8ba4 Mon Sep 17 00:00:00 2001 From: ajaxfan <909938737@qq.com> Date: Wed, 24 Mar 2021 18:33:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0seata=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E6=8B=A6=E6=88=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BusinessExceptionHandlerAdvice.java | 433 +++++++++--------- 1 file changed, 219 insertions(+), 214 deletions(-) diff --git a/uboot-common/src/main/java/com/chinaunicom/mall/ebtp/common/exception/service/BusinessExceptionHandlerAdvice.java b/uboot-common/src/main/java/com/chinaunicom/mall/ebtp/common/exception/service/BusinessExceptionHandlerAdvice.java index b81a9f1..33b0423 100644 --- a/uboot-common/src/main/java/com/chinaunicom/mall/ebtp/common/exception/service/BusinessExceptionHandlerAdvice.java +++ b/uboot-common/src/main/java/com/chinaunicom/mall/ebtp/common/exception/service/BusinessExceptionHandlerAdvice.java @@ -34,13 +34,13 @@ import com.chinaunicom.mall.ebtp.common.util.JsonUtils; import cn.hutool.core.convert.Convert; import cn.hutool.core.exceptions.ExceptionUtil; import io.seata.core.context.RootContext; +import io.seata.core.exception.RmTransactionException; import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; /** - * 异常处理 - * 拦截BindException异常,返回HttpStatus是400的绑定错误信息 + * 异常处理 拦截BindException异常,返回HttpStatus是400的绑定错误信息 * 拦截FrameException异常,返回HttpStatus是406的业务处理错误信息(支持自定义状态码) * 拦截Exception异常,返回HttpStatus是500服务器内部异常 * @@ -53,238 +53,243 @@ import lombok.extern.slf4j.Slf4j; @ConditionalOnProperty(name = "mconfig.exception-handle-enabled", matchIfMissing = true) public class BusinessExceptionHandlerAdvice { - - /** - * 业务异常处理 - * - * @param request 请求 - * @param exception ServiceErrorException异常对象 - * @return 响应 - */ - @ExceptionHandler(value = BusinessException.class) - @ResponseStatus(HttpStatus.OK) - public BaseResponse serviceErrorException(HttpServletRequest request, BusinessException exception) { - //堆栈信息转为字符串 - log.info(ExceptionUtil.stacktraceToString(exception)); - Map body = new HashMap<>(); + /** + * 业务异常处理 + * + * @param request 请求 + * @param exception ServiceErrorException异常对象 + * @return 响应 + */ + @ExceptionHandler(value = BusinessException.class) + @ResponseStatus(HttpStatus.OK) + public BaseResponse serviceErrorException(HttpServletRequest request, BusinessException exception) { + // 堆栈信息转为字符串 + log.info(ExceptionUtil.stacktraceToString(exception)); + Map body = new HashMap<>(); // body.put("path", request.getRequestURI()); - return BaseResponse.fail(exception.getCode(), exception.getMessage(), Convert.toStr(body)); - } + return BaseResponse.fail(exception.getCode(), exception.getMessage(), Convert.toStr(body)); + } - /** - * hibernate valid 验证异常拦截 - * - * @param request 请求 - * @param exception ServiceErrorException异常对象 - * @return 响应 - */ - @ExceptionHandler(value = MethodArgumentNotValidException.class) - @ResponseStatus(HttpStatus.BAD_REQUEST) - public BaseResponse handleInvalidMethodArgException(HttpServletRequest request, MethodArgumentNotValidException exception) { - //堆栈信息转为字符串 - log.info(ExceptionUtil.stacktraceToString(exception)); - //按需重新封装需要返回的错误信息 - List invalidArguments = new ArrayList<>(); - //解析原错误信息,封装后返回,此处返回非法的字段名称,原始值,错误信息 - BindingResult bindingResult = exception.getBindingResult(); - for (FieldError error : bindingResult.getFieldErrors()) { - ArgumentInvalidResult invalidArgument = new ArgumentInvalidResult(); - invalidArgument.setDefaultMessage(error.getDefaultMessage()); - invalidArgument.setField(error.getField()); - invalidArgument.setRejectedValue(error.getRejectedValue()); - invalidArguments.add(invalidArgument); - } - Map body = new HashMap<>(); - body.put("errors", JsonUtils.objectToJson(invalidArguments)); - body.put("error", HttpStatus.BAD_REQUEST.getReasonPhrase()); + /** + * hibernate valid 验证异常拦截 + * + * @param request 请求 + * @param exception ServiceErrorException异常对象 + * @return 响应 + */ + @ExceptionHandler(value = MethodArgumentNotValidException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public BaseResponse handleInvalidMethodArgException(HttpServletRequest request, + MethodArgumentNotValidException exception) { + // 堆栈信息转为字符串 + log.info(ExceptionUtil.stacktraceToString(exception)); + // 按需重新封装需要返回的错误信息 + List invalidArguments = new ArrayList<>(); + // 解析原错误信息,封装后返回,此处返回非法的字段名称,原始值,错误信息 + BindingResult bindingResult = exception.getBindingResult(); + for (FieldError error : bindingResult.getFieldErrors()) { + ArgumentInvalidResult invalidArgument = new ArgumentInvalidResult(); + invalidArgument.setDefaultMessage(error.getDefaultMessage()); + invalidArgument.setField(error.getField()); + invalidArgument.setRejectedValue(error.getRejectedValue()); + invalidArguments.add(invalidArgument); + } + Map body = new HashMap<>(); + body.put("errors", JsonUtils.objectToJson(invalidArguments)); + body.put("error", HttpStatus.BAD_REQUEST.getReasonPhrase()); // body.put("path", request.getRequestURI()); - return BaseResponse.fail(HttpStatus.BAD_REQUEST.value(), "参数验证错误", Convert.toStr(body)); - } + return BaseResponse.fail(HttpStatus.BAD_REQUEST.value(), "参数验证错误", Convert.toStr(body)); + } - /** - * 参数绑定异常 - * - * @param request 请求 - * @param exception BindException异常对象 - * @return 响应 - */ - @ExceptionHandler(value = BindException.class) - @ResponseStatus(HttpStatus.BAD_REQUEST) - public BaseResponse methodArgumentNotValidHandler( - HttpServletRequest request, BindException exception) { - //按需重新封装需要返回的错误信息 - List invalidArguments = new ArrayList<>(); - //解析原错误信息,封装后返回,此处返回非法的字段名称,原始值,错误信息 - for (FieldError error : exception.getBindingResult().getFieldErrors()) { - ArgumentInvalidResult invalidArgument = new ArgumentInvalidResult(); - invalidArgument.setDefaultMessage(error.getDefaultMessage()); - invalidArgument.setField(error.getField()); - invalidArgument.setRejectedValue(error.getRejectedValue()); - invalidArguments.add(invalidArgument); - } - Map body = new HashMap<>(); - body.put("errors", JsonUtils.objectToJson(invalidArguments)); - body.put("error", HttpStatus.BAD_REQUEST.getReasonPhrase()); + /** + * 参数绑定异常 + * + * @param request 请求 + * @param exception BindException异常对象 + * @return 响应 + */ + @ExceptionHandler(value = BindException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public BaseResponse methodArgumentNotValidHandler(HttpServletRequest request, BindException exception) { + // 按需重新封装需要返回的错误信息 + List invalidArguments = new ArrayList<>(); + // 解析原错误信息,封装后返回,此处返回非法的字段名称,原始值,错误信息 + for (FieldError error : exception.getBindingResult().getFieldErrors()) { + ArgumentInvalidResult invalidArgument = new ArgumentInvalidResult(); + invalidArgument.setDefaultMessage(error.getDefaultMessage()); + invalidArgument.setField(error.getField()); + invalidArgument.setRejectedValue(error.getRejectedValue()); + invalidArguments.add(invalidArgument); + } + Map body = new HashMap<>(); + body.put("errors", JsonUtils.objectToJson(invalidArguments)); + body.put("error", HttpStatus.BAD_REQUEST.getReasonPhrase()); // body.put("path", request.getRequestURI()); - return BaseResponse.fail(HttpStatus.BAD_REQUEST.value(), "参数错误", Convert.toStr(body)); - } + return BaseResponse.fail(HttpStatus.BAD_REQUEST.value(), "参数错误", Convert.toStr(body)); + } - /** - * 请求方式异常 - * - * @param request 请求 - * @param exception HttpRequestMethodNotSupportedException异常对象 - * @return 响应 - */ - @ExceptionHandler(HttpRequestMethodNotSupportedException.class) - @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED) - public BaseResponse handleMethodNotSupportedException(HttpServletRequest request, HttpRequestMethodNotSupportedException exception) { - Map body = new HashMap<>(); - body.put("errors", exception.getMessage()); - body.put("error", HttpStatus.METHOD_NOT_ALLOWED.getReasonPhrase()); + /** + * 请求方式异常 + * + * @param request 请求 + * @param exception HttpRequestMethodNotSupportedException异常对象 + * @return 响应 + */ + @ExceptionHandler(HttpRequestMethodNotSupportedException.class) + @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED) + public BaseResponse handleMethodNotSupportedException(HttpServletRequest request, + HttpRequestMethodNotSupportedException exception) { + Map body = new HashMap<>(); + body.put("errors", exception.getMessage()); + body.put("error", HttpStatus.METHOD_NOT_ALLOWED.getReasonPhrase()); // body.put("path", request.getRequestURI()); - return BaseResponse.fail(HttpStatus.METHOD_NOT_ALLOWED.value(), "错误的请求方式", Convert.toStr(body)); - } + return BaseResponse.fail(HttpStatus.METHOD_NOT_ALLOWED.value(), "错误的请求方式", Convert.toStr(body)); + } - /** - * 参数缺失 - * - * @param request 请求 - * @param exception MissingServletRequestParameterException异常对象 - * @return 响应 - */ - @ExceptionHandler(MissingServletRequestParameterException.class) - @ResponseStatus(HttpStatus.BAD_REQUEST) - public BaseResponse handleMissingParameterException(HttpServletRequest request, MissingServletRequestParameterException exception) { - Map body = new HashMap<>(); - body.put("errors", exception.getMessage()); - body.put("error", HttpStatus.BAD_REQUEST.getReasonPhrase()); + /** + * 参数缺失 + * + * @param request 请求 + * @param exception MissingServletRequestParameterException异常对象 + * @return 响应 + */ + @ExceptionHandler(MissingServletRequestParameterException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public BaseResponse handleMissingParameterException(HttpServletRequest request, + MissingServletRequestParameterException exception) { + Map body = new HashMap<>(); + body.put("errors", exception.getMessage()); + body.put("error", HttpStatus.BAD_REQUEST.getReasonPhrase()); // body.put("path", request.getRequestURI()); - return BaseResponse.fail(HttpStatus.BAD_REQUEST.value(), "参数缺失" + exception.getMessage(), Convert.toStr(body)); - } + return BaseResponse.fail(HttpStatus.BAD_REQUEST.value(), "参数缺失" + exception.getMessage(), Convert.toStr(body)); + } - // ----------------------------data-------------------------------------- + // ----------------------------data-------------------------------------- - /** - * 数据库异常 - * - * @param request 请求 - * @param exception DataAccessException异常对象 - * @return 响应 - */ - @ExceptionHandler(DataAccessException.class) - @ResponseStatus(HttpStatus.BAD_REQUEST) - public BaseResponse handlerDataAccessException(HttpServletRequest request, DataAccessException exception) { - log.error(ExceptionUtil.stacktraceToString(exception)); - Map body = new HashMap<>(); - body.put("errors", exception.getMessage()); - body.put("error", HttpStatus.BAD_REQUEST.getReasonPhrase()); + /** + * 数据库异常 + * + * @param request 请求 + * @param exception DataAccessException异常对象 + * @return 响应 + */ + @ExceptionHandler(DataAccessException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public BaseResponse handlerDataAccessException(HttpServletRequest request, DataAccessException exception) { + log.error(ExceptionUtil.stacktraceToString(exception)); + Map body = new HashMap<>(); + body.put("errors", exception.getMessage()); + body.put("error", HttpStatus.BAD_REQUEST.getReasonPhrase()); // body.put("path", request.getRequestURI()); - return BaseResponse.fail(HttpStatus.BAD_REQUEST.value(), "数据库异常" + exception.getMessage(), Convert.toStr(body)); - } + return BaseResponse.fail(HttpStatus.BAD_REQUEST.value(), "数据库异常" + exception.getMessage(), Convert.toStr(body)); + } - /** - * 数据不存在 - * - * @param request 请求 - * @param exception EmptyResultDataAccessException异常对象 - * @return 响应 - */ - @ExceptionHandler(EmptyResultDataAccessException.class) - @ResponseStatus(HttpStatus.BAD_REQUEST) - public BaseResponse handleDataEmptyException(HttpServletRequest request, EmptyResultDataAccessException exception) { - Map body = new HashMap<>(); - body.put("errors", exception.getMessage()); - body.put("error", HttpStatus.BAD_REQUEST.getReasonPhrase()); + /** + * 数据不存在 + * + * @param request 请求 + * @param exception EmptyResultDataAccessException异常对象 + * @return 响应 + */ + @ExceptionHandler(EmptyResultDataAccessException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public BaseResponse handleDataEmptyException(HttpServletRequest request, + EmptyResultDataAccessException exception) { + Map body = new HashMap<>(); + body.put("errors", exception.getMessage()); + body.put("error", HttpStatus.BAD_REQUEST.getReasonPhrase()); // body.put("path", request.getRequestURI()); - return BaseResponse.fail(HttpStatus.BAD_REQUEST.value(), "数据不存在", Convert.toStr(body)); - } + return BaseResponse.fail(HttpStatus.BAD_REQUEST.value(), "数据不存在", Convert.toStr(body)); + } - /** - * 请求方式异常 - * - * @param request 请求 - * @param exception DuplicateKeyException异常对象 - * @return 响应 - */ - @ExceptionHandler(DuplicateKeyException.class) - @ResponseStatus(HttpStatus.BAD_REQUEST) - public BaseResponse handleDataDualException(HttpServletRequest request, DuplicateKeyException exception) { - Map body = new HashMap<>(); - body.put("errors", exception.getMessage()); - body.put("error", HttpStatus.BAD_REQUEST.getReasonPhrase()); + /** + * 请求方式异常 + * + * @param request 请求 + * @param exception DuplicateKeyException异常对象 + * @return 响应 + */ + @ExceptionHandler(DuplicateKeyException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public BaseResponse handleDataDualException(HttpServletRequest request, DuplicateKeyException exception) { + Map body = new HashMap<>(); + body.put("errors", exception.getMessage()); + body.put("error", HttpStatus.BAD_REQUEST.getReasonPhrase()); // body.put("path", request.getRequestURI()); - return BaseResponse.fail(HttpStatus.BAD_REQUEST.value(), "数据重复插入", Convert.toStr(body)); - } + return BaseResponse.fail(HttpStatus.BAD_REQUEST.value(), "数据重复插入", Convert.toStr(body)); + } - /** - * 方法参数类型不匹配异常 - * - * @param request 请求 - * @param exception MethodArgumentTypeMismatchException异常对象 - * @return 响应 - */ - @ExceptionHandler(MethodArgumentTypeMismatchException.class) - @ResponseStatus(HttpStatus.BAD_REQUEST) - public BaseResponse handleMethodArgumentTypeException(HttpServletRequest request, MethodArgumentTypeMismatchException exception) { - Map body = new HashMap<>(); - body.put("errors", exception.getMessage()); - body.put("error", HttpStatus.BAD_REQUEST.getReasonPhrase()); + /** + * 方法参数类型不匹配异常 + * + * @param request 请求 + * @param exception MethodArgumentTypeMismatchException异常对象 + * @return 响应 + */ + @ExceptionHandler(MethodArgumentTypeMismatchException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public BaseResponse handleMethodArgumentTypeException(HttpServletRequest request, + MethodArgumentTypeMismatchException exception) { + Map body = new HashMap<>(); + body.put("errors", exception.getMessage()); + body.put("error", HttpStatus.BAD_REQUEST.getReasonPhrase()); // body.put("path", request.getRequestURI()); - return BaseResponse.fail(HttpStatus.BAD_REQUEST.value(), "参数类型不匹配", Convert.toStr(body)); - } + return BaseResponse.fail(HttpStatus.BAD_REQUEST.value(), "参数类型不匹配", Convert.toStr(body)); + } - /** - * 全局异常处理 - * - * @param request 请求 - * @param exception Exception异常对象 - * @return 响应 - */ - @ExceptionHandler(value = Exception.class) - @ResponseStatus(HttpStatus.BAD_REQUEST) - public BaseResponse handleException(HttpServletRequest request, Exception exception) { - //堆栈信息转为字符串 - log.info(ExceptionUtil.stacktraceToString(exception)); - Map body = new HashMap<>(); - body.put("errors", exception.getMessage()); - body.put("error", HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase()); + /** + * 全局异常处理 + * + * @param request 请求 + * @param exception Exception异常对象 + * @return 响应 + */ + @ExceptionHandler(value = Exception.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public BaseResponse handleException(HttpServletRequest request, Exception exception) { + // 堆栈信息转为字符串 + log.info(ExceptionUtil.stacktraceToString(exception)); + Map body = new HashMap<>(); + body.put("errors", exception.getMessage()); + body.put("error", HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase()); // body.put("path", request.getRequestURI()); - return BaseResponse.fail(HttpStatus.INTERNAL_SERVER_ERROR.value(), "系统异常:" + exception.getMessage(), Convert.toStr(body)); - } - - @ExceptionHandler({TransactionSystemException.class}) - @ResponseStatus(HttpStatus.BAD_REQUEST) - public BaseResponse handleTransactionSystemException(HttpServletRequest request, TransactionSystemException exception) { - log.info(ExceptionUtil.stacktraceToString(exception)); - if (((String)Objects.requireNonNull(exception.getMessage())).contains("may be has finished")) { - String xid = RootContext.getXID(); - if (StringUtils.isNotEmpty(xid)) { - RootContext.unbind(); - log.debug("TransactionSystemException ----- suspending current transaction,xid = {}", xid); - } - } + return BaseResponse.fail(HttpStatus.INTERNAL_SERVER_ERROR.value(), "系统异常:" + exception.getMessage(), + Convert.toStr(body)); + } - return BaseResponse.fail("系统繁忙,请重试", exception.getMessage()); - } + @ExceptionHandler({ TransactionSystemException.class, RmTransactionException.class }) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public BaseResponse handleTransactionSystemException(HttpServletRequest request, + TransactionSystemException exception) { + log.info(ExceptionUtil.stacktraceToString(exception)); + if (((String) Objects.requireNonNull(exception.getMessage())).contains("may be has finished")) { + String xid = RootContext.getXID(); + if (StringUtils.isNotEmpty(xid)) { + RootContext.unbind(); + log.debug("TransactionSystemException ----- suspending current transaction,xid = {}", xid); + } + } - /** - * 参数异常 - */ - @Getter - @Setter - class ArgumentInvalidResult { - /** - * 字段名 - */ - private String field; - /** - * 输入的错误值 - */ - private Object rejectedValue; - /** - * 错误信息 - */ - private String defaultMessage; - } + return BaseResponse.fail("系统繁忙,请重试", exception.getMessage()); + } + + /** + * 参数异常 + */ + @Getter + @Setter + class ArgumentInvalidResult { + /** + * 字段名 + */ + private String field; + /** + * 输入的错误值 + */ + private Object rejectedValue; + /** + * 错误信息 + */ + private String defaultMessage; + } } \ No newline at end of file