| | |
| | | import org.springframework.web.bind.annotation.RestControllerAdvice; |
| | | import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; |
| | | import org.springframework.web.servlet.NoHandlerFoundException; |
| | | import org.springframework.dao.DuplicateKeyException; |
| | | |
| | | import javax.servlet.http.HttpServletRequest; |
| | | import javax.validation.ConstraintViolation; |
| | |
| | | } |
| | | if (ex instanceof AccessDeniedException) { |
| | | return accessDeniedExceptionHandler(request, (AccessDeniedException) ex); |
| | | } |
| | | if (ex instanceof DuplicateKeyException) { |
| | | return duplicateKeyExceptionHandler((DuplicateKeyException) ex); |
| | | } |
| | | return defaultExceptionHandler(request, ex); |
| | | } |
| | |
| | | } |
| | | |
| | | /** |
| | | * 处理业务异常 SQLIntegrityConstraintViolationException |
| | | * |
| | | * 数据库存在重复数据 |
| | | */ |
| | | @ExceptionHandler(value = DuplicateKeyException.class) |
| | | public CommonResult<?> duplicateKeyExceptionHandler(DuplicateKeyException ex) { |
| | | log.warn("[duplicateKeyExceptionHandler]", ex); |
| | | return CommonResult.error(DATA_REPETITION.getCode(), DATA_REPETITION.getMsg()); |
| | | } |
| | | |
| | | /** |
| | | * 处理业务异常 ServiceException |
| | | * |
| | | * 例如说,商品库存不足,用户手机号已存在。 |
| | | */ |
| | | @ExceptionHandler(value = ServiceException.class) |
| | | public CommonResult<?> serviceExceptionHandler(ServiceException ex) { |
| | | // 不包含的时候,才进行打印,避免 ex 堆栈过多 |
| | | if (!IGNORE_ERROR_MESSAGES.contains(ex.getMessage())) { |
| | | // 不包含的时候,才进行打印,避免 ex 堆栈过多 |
| | | log.info("[serviceExceptionHandler]", ex); |
| | | // 即使打印,也只打印第一层 StackTraceElement,并且使用 warn 在控制台输出,更容易看到 |
| | | StackTraceElement[] stackTrace = ex.getStackTrace(); |
| | | log.warn("[serviceExceptionHandler]\n\t{}", stackTrace[0]); |
| | | } |
| | | return CommonResult.error(ex.getCode(), ex.getMessage()); |
| | | } |
| | |
| | | } |
| | | // 1. 数据报表 |
| | | if (message.contains("report_")) { |
| | | log.error("[报表模块 iailab-module-report - 表结构未导入][参考 https://doc.iocoder.cn/report/ 开启]"); |
| | | log.error("[报表模块 yudao-module-report - 表结构未导入][参考 https://cloud.iocoder.cn/report/ 开启]"); |
| | | return CommonResult.error(NOT_IMPLEMENTED.getCode(), |
| | | "[报表模块 iailab-module-report - 表结构未导入][参考 https://doc.iocoder.cn/report/ 开启]"); |
| | | "[报表模块 yudao-module-report - 表结构未导入][参考 https://cloud.iocoder.cn/report/ 开启]"); |
| | | } |
| | | // 2. 工作流 |
| | | if (message.contains("bpm_")) { |
| | | log.error("[工作流模块 iailab-module-bpm - 表结构未导入][参考 https://doc.iocoder.cn/bpm/ 开启]"); |
| | | log.error("[工作流模块 yudao-module-bpm - 表结构未导入][参考 https://cloud.iocoder.cn/bpm/ 开启]"); |
| | | return CommonResult.error(NOT_IMPLEMENTED.getCode(), |
| | | "[工作流模块 iailab-module-bpm - 表结构未导入][参考 https://doc.iocoder.cn/bpm/ 开启]"); |
| | | "[工作流模块 yudao-module-bpm - 表结构未导入][参考 https://cloud.iocoder.cn/bpm/ 开启]"); |
| | | } |
| | | // 3. 微信公众号 |
| | | if (message.contains("mp_")) { |
| | | log.error("[微信公众号 iailab-module-mp - 表结构未导入][参考 https://doc.iocoder.cn/mp/build/ 开启]"); |
| | | log.error("[微信公众号 yudao-module-mp - 表结构未导入][参考 https://cloud.iocoder.cn/mp/build/ 开启]"); |
| | | return CommonResult.error(NOT_IMPLEMENTED.getCode(), |
| | | "[微信公众号 iailab-module-mp - 表结构未导入][参考 https://doc.iocoder.cn/mp/build/ 开启]"); |
| | | "[微信公众号 yudao-module-mp - 表结构未导入][参考 https://cloud.iocoder.cn/mp/build/ 开启]"); |
| | | } |
| | | // 4. 商城系统 |
| | | if (StrUtil.containsAny(message, "product_", "promotion_", "trade_")) { |
| | | log.error("[商城系统 iailab-module-mall - 已禁用][参考 https://doc.iocoder.cn/mall/build/ 开启]"); |
| | | log.error("[商城系统 yudao-module-mall - 已禁用][参考 https://cloud.iocoder.cn/mall/build/ 开启]"); |
| | | return CommonResult.error(NOT_IMPLEMENTED.getCode(), |
| | | "[商城系统 iailab-module-mall - 已禁用][参考 https://doc.iocoder.cn/mall/build/ 开启]"); |
| | | "[商城系统 yudao-module-mall - 已禁用][参考 https://cloud.iocoder.cn/mall/build/ 开启]"); |
| | | } |
| | | // 5. ERP 系统 |
| | | if (message.contains("erp_")) { |
| | | log.error("[ERP 系统 iailab-module-erp - 表结构未导入][参考 https://doc.iocoder.cn/erp/build/ 开启]"); |
| | | log.error("[ERP 系统 yudao-module-erp - 表结构未导入][参考 https://cloud.iocoder.cn/erp/build/ 开启]"); |
| | | return CommonResult.error(NOT_IMPLEMENTED.getCode(), |
| | | "[ERP 系统 iailab-module-erp - 表结构未导入][参考 https://doc.iocoder.cn/erp/build/ 开启]"); |
| | | "[ERP 系统 yudao-module-erp - 表结构未导入][参考 https://cloud.iocoder.cn/erp/build/ 开启]"); |
| | | } |
| | | // 6. CRM 系统 |
| | | if (message.contains("crm_")) { |
| | | log.error("[CRM 系统 iailab-module-crm - 表结构未导入][参考 https://doc.iocoder.cn/crm/build/ 开启]"); |
| | | log.error("[CRM 系统 yudao-module-crm - 表结构未导入][参考 https://cloud.iocoder.cn/crm/build/ 开启]"); |
| | | return CommonResult.error(NOT_IMPLEMENTED.getCode(), |
| | | "[CRM 系统 iailab-module-crm - 表结构未导入][参考 https://doc.iocoder.cn/crm/build/ 开启]"); |
| | | "[CRM 系统 yudao-module-crm - 表结构未导入][参考 https://cloud.iocoder.cn/crm/build/ 开启]"); |
| | | } |
| | | // 7. 支付平台 |
| | | if (message.contains("pay_")) { |
| | | log.error("[支付模块 iailab-module-pay - 表结构未导入][参考 https://doc.iocoder.cn/pay/build/ 开启]"); |
| | | log.error("[支付模块 yudao-module-pay - 表结构未导入][参考 https://cloud.iocoder.cn/pay/build/ 开启]"); |
| | | return CommonResult.error(NOT_IMPLEMENTED.getCode(), |
| | | "[支付模块 iailab-module-pay - 表结构未导入][参考 https://doc.iocoder.cn/pay/build/ 开启]"); |
| | | "[支付模块 yudao-module-pay - 表结构未导入][参考 https://cloud.iocoder.cn/pay/build/ 开启]"); |
| | | } |
| | | // 8. AI 大模型 |
| | | if (message.contains("ai_")) { |
| | | log.error("[AI 大模型 yudao-module-ai - 表结构未导入][参考 https://cloud.iocoder.cn/ai/build/ 开启]"); |
| | | return CommonResult.error(NOT_IMPLEMENTED.getCode(), |
| | | "[AI 大模型 yudao-module-ai - 表结构未导入][参考 https://cloud.iocoder.cn/ai/build/ 开启]"); |
| | | } |
| | | return null; |
| | | } |