💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
``` /** * @author 张跃帅 * @Description: 全局异常处理器 * @date 2020/08/12 */ @Slf4j @ControllerAdvice @ResponseBody public class GlobalException { /** * 捕获-自定义异常 */ @ExceptionHandler(MyException.class) public MyResult myException(MyException e, HttpServletRequest request) { // 获取参数 String userFullName = this.getReqUserFullName(request); String currentReqURL = request.getRequestURI(); log.error(">>> 自定义异常→ 请求用户:{},请求URL为:{},具体信息为:{}", userFullName, currentReqURL, e); // 返回 return MyResult.error(e.getCode(), e.getMsg()); } /** * 请求参数缺失异常 */ @ExceptionHandler(MissingServletRequestParameterException.class) public MyResult reqParamException(MissingServletRequestParameterException e, HttpServletRequest request) { // 获取参数 String userFullName = this.getReqUserFullName(request); String currentReqURL = request.getRequestURI(); // 获取参数 String parameterType = e.getParameterType(); String parameterName = e.getParameterName(); String msg = StrUtil.format("请求参数异常:请求的参数{},与接收{}的类型不匹配", parameterName, parameterType); log.error(">>> 请求参数异常→ 请求用户:{},请求URL为:{},具体信息为:{}", userFullName, currentReqURL, e); // 返回 return MyResult.error(CommonExceptionEnum.ERROR_400.getCode(), msg); } /** * 拦截参数格式传递异常 */ @ExceptionHandler(HttpMessageNotReadableException.class) public MyResult paramFormatException(HttpMessageNotReadableException e, HttpServletRequest request) { // 获取参数 String userFullName = this.getReqUserFullName(request); String currentReqURL = request.getRequestURI(); log.error(">>> 参数格式传递异常→ 请求用户:{},请求URL为:{},具体信息为:{}", userFullName, currentReqURL, e); // 返回 return MyResult.error(CommonExceptionEnum.ERROR_400.getCode(), "请求JSON参数格式不正确,请检查参数格式"); } /** * 捕获-字段值,超出数据库字段的长度 */ @ExceptionHandler(DataIntegrityViolationException.class) public MyResult fieldValLengthException(DataIntegrityViolationException e, HttpServletRequest request) { // 获取参数 String userFullName = this.getReqUserFullName(request); String currentReqURL = request.getRequestURI(); log.error(">>> 字段值异常→ 请求用户:{},请求URL为:{},具体信息为:{}", userFullName, currentReqURL, e); // 返回 return MyResult.error(CommonExceptionEnum.ERROR_400.getCode(), "当前字段值:超出数据库字段的存储长度"); } /** * 主键或unique索引,数据重复异常 */ @ExceptionHandler(DuplicateKeyException.class) public MyResult duplicateKeyException(DuplicateKeyException e, HttpServletRequest request) { // 获取参数 String userFullName = this.getReqUserFullName(request); String currentReqURL = request.getRequestURI(); log.error(">>> 主键或unique索引重复异常→ 请求用户:{},请求URL为:{},具体信息为:{}", userFullName, currentReqURL, e); // 返回 return MyResult.error(CommonExceptionEnum.ERROR_400.getCode(), "主键或unique索引重复异常:" + e.getMessage()); } /** * Mybatis系统异常 */ @ExceptionHandler(MyBatisSystemException.class) public MyResult myBatisException(MyBatisSystemException e, HttpServletRequest request) { // 获取参数 String userFullName = this.getReqUserFullName(request); String currentReqURL = request.getRequestURI(); log.error(">>> Mybatis系统异常→ 请求用户:{},请求URL为:{},具体信息为:{}", userFullName, currentReqURL, e); // 获取异常信息 String msg = e.getMessage(); // 判断-是否包含 if (msg.contains("CannotFindDataSourceException")) { // 返回 return MyResult.error(CommonExceptionEnum.ERROR_400.getCode(), "mybatis未找到数据源,请联系管理员"); } // 返回 return MyResult.error(CommonExceptionEnum.ERROR_400.getCode(), "mybatis异常:" + msg); } /** * 拦截请求方式的异常 */ @ExceptionHandler(HttpRequestMethodNotSupportedException.class) public MyResult reqTypeException(HttpServletRequest request) { // 获取参数 String userFullName = this.getReqUserFullName(request); String currentReqURL = request.getRequestURI(); // 参数-变量 String msg = null; // 判断-GET请求 if (ServletUtil.isGetMethod(request)) { msg = "不支持该请求方法,请求方法为GET"; } // 判断-POST请求 if (ServletUtil.isPostMethod(request)) { msg = "不支持该请求方法,请求方法为POST"; } log.error(">>> 请求方式异常→ 请求用户:{},请求URL为:{},具体信息为:{}", userFullName, currentReqURL, msg); // 返回 return MyResult.error(CommonExceptionEnum.ERROR_400.getCode(), msg); } /** * 文件上传的异常 */ @ExceptionHandler(MultipartException.class) public MyResult uploadFileException(Exception e, HttpServletRequest request) { // 获取参数 String userFullName = this.getReqUserFullName(request); String currentReqURL = request.getRequestURI(); // 参数-变量 String msg = null; // 判断 if (e.getCause().getCause() instanceof FileSizeLimitExceededException) { msg = "文件上传过大[单文件大小不得超过500M]"; } else if (e.getCause().getCause() instanceof SizeLimitExceededException) { msg = "文件上传过大[总上传文件大小不得超过1G]"; } else { msg = "文件上传失败"; } log.error(">>> 文件上传异常→ 请求用户:{},请求URL为:{},具体信息为:{}", userFullName, currentReqURL, msg); // 返回 return MyResult.error(CommonExceptionEnum.ERROR_400.getCode(), msg); } /** * 拦截未知的运行时异常 */ @ExceptionHandler(Throwable.class) public MyResult serverException(Throwable e, HttpServletRequest request) { // 获取参数 String userFullName = this.getReqUserFullName(request); String currentReqURL = request.getRequestURI(); // 获取异常信息 String msg = e.getMessage(); // 判断-是否包含 if (msg.contains("SQLSyntaxErrorException")) { log.error(">>> SQL语句错误异常→ 请求用户:{},请求URL为:{},具体信息为:{}", userFullName, currentReqURL, e); // 返回 return MyResult.error(CommonExceptionEnum.ERROR_400.getCode(), "SQL语句错误异常:" + msg); } else { log.error(">>> 服务器运行异常→ 请求用户:{},请求URL为:{},具体信息为:{}", userFullName, currentReqURL, e); } // 返回 return MyResult.error(CommonExceptionEnum.ERROR_500.getCode(), "服务器运行异常:" + msg); } /*** * 获取请求用户全称 */ private String getReqUserFullName (HttpServletRequest request) { // 变量 String userFullName = null; // 变量-是否放行请求URL Boolean doReqURL = false; // 获取请求路径 String servletPath = request.getServletPath(); // 获取不拦截的URL List<String> satokenFreeList = SatokenFreeRedisCache.getSatokenFreeList(); // 判断 if (satokenFreeList != null && satokenFreeList.size() > 0) { // 创建路径匹配器 final PathMatcher pathMatcher = new AntPathMatcher(); // 遍历 for (String satokenFree : satokenFreeList) { // 判断 if (pathMatcher.match(satokenFree, servletPath)) { // 放行 doReqURL = true; // 如果URL匹配成功就不循环了,直接退出循环 break; } } } // 判断 if (false == doReqURL) { // 获取当前登录用户 SatokenUser satokenUser = LoginUserUtil.getLoginSatokenUserByToken(); // 获取参数 String userName = satokenUser.getTrueName(); Long userId = satokenUser.getUserId(); // 赋值 userFullName = (userName + "-" + userId); } // 返回 return userFullName; } }