```
/**
* @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;
}
}
- Jump简介
- 技术架构
- 代码规范
- 规范导读
- JAVA规范
- 数据库表设计规范
- 集成项目
- JDK1.8-pom.xml
- JDK21-pom.xml
- 项目结构
- 业务模块-方法名称规范
- 跨域配置
- License授权配置
- 公共字段自动填充
- 全局异常处理器
- PageOffice配置
- Beetl模板引擎配置
- application.properties
- application-prod.yml
- banner.txt
- logback-spring.xml
- jump-core (核心组件)
- Maven依赖
- 通用枚举
- 公共数据状态 - 枚举
- 公共逻辑删除 - 枚举
- 公共操作编码类型 - 枚举
- 公共tree父节点 - 枚举
- 公共是或否 - 枚举
- 工具Util
- AopTargetUtil
- DownloadUtil
- GenerateNumUtil
- HttpServletUtil
- IpUtil
- JoinPointUtil
- MacUtil
- NetworkUtil
- ParamToUtil
- ResponseUtil
- TimeZoneDateUtil
- UaUtil
- 统一返回
- 结果对象
- 如何使用
- jump-cahche (缓存组件)
- Maven依赖
- Redis配置
- 缓存常量
- 工具Util
- RedisCacheUtil
- jump-idempotent (幕等组件)
- Maven依赖
- Context上下文
- 操作器
- 接口
- 如何实现
- AOP参数
- AOP使用方法
- jump-lock (分布式锁组件)
- Maven依赖
- 枚举
- AOP参数
- AOP使用方法
- 工具Util
- RedissonLockUtil
- Util使用方法
- jump-mybatis (mybatis组件)
- Maven依赖
- 基础Entity
- 枚举
- 查询类型 - 枚举
- 条件查询
- search
- service
- 分页结果集
- Mapper
- MyMapper
- 使用方法
- DDL操作
- DML操作
- 工具Util
- EntityUtil
- PageUtil
- TableUtil
- jump-dynamic-datasource (多数据源组件)
- Maven依赖
- Context上下文
- 操作器
- 接口
- 如何实现
- 工具Util
- DatasourceUtil
- 如何使用
- jump-satoken (satoken组件)
- Maven依赖
- Context上下文
- 操作器
- 接口
- 如何实现
- Satoken配置信息
- SatokenUser信息
- Redis缓存操作
- SatokenRedisCache
- SatokenUserRedisCache
- 放行白名单
- jump-oss (OSS组件)
- Maven依赖
- 工具Util
- OssFileUtil
- OssPlatformUtil
- 如何使用
- jump-xss (XSS组件)
- Maven依赖
- 白名单放行
- jump-email (邮件组件)
- Maven依赖
- Email客户端信息
- Email发送参数
- 工具Util
- jump-websocket (WebSocket组件)
- Maven依赖
- 消息对象
- 工具Util
- 如何使用
- jump-weixin (微信组件)
- Maven依赖
- jump-system (系统管理组件)
- Maven依赖
- AOP
- 系统操作日志AOP
- 系统数据日志AOP
- 系统操作权限AOP
- 字典转文本AOP
- Redis缓存操作
- SystemConfigRedisCache
- 工具Util
- LoginUserUtil
- SystemAreaUtil
- SystemHomeUtil
- SystemMenuUtil
- SystemOrgAdminUtil
- SystemOrgTypeUtil
- SystemRoleUtil
- SystemUserLoginAreaUtil
- SystemUserUtil
- jump-timer(定时器组件)
- Maven依赖
- 枚举
- Api接口
- 工具Util
- ActionClassUtil
- TimerTaskUtil
- 如何使用
- jump-ueditor (富文本组件)
- Maven依赖
- 如何使用
- 配置 ueditor.config.js
- 后端 application.properties
- 前端 vue3
- vue-codemirror (代码编译器)
- npm依赖
- PageOffice整合
- Maven依赖
- License授权配置
- 枚举
- 文件来源 - 枚举
- 预览文件类型 - 枚举
- 文件预览参数
- 下载文件
- 预览文件
- 工具Util