文档说明
开发步骤
我们接着上面这个项目继续,先来看看表的SQL,其中用户名和密码不能为空,但是我们发送这样一个请求
-- 用户表 CREATE TABLE `user` ( `id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '用户 ID', `username` VARCHAR(20) NOT NULL COMMENT '用户名', `password` VARCHAR(20) NOT NULL COMMENT '密码', `birthday` DATE COMMENT '出生日期' );
接收请求的Controller如下
@PostMapping public R add(@RequestBody User user);
请求:
请求体:
{"username": "XiaoHH", "birthday": "1996-02-10"} • 1
可以发现密码是为空的,那么后端的返回就是:
然后前端一脸懵逼直接说后端技术不行,今天就教你怎么解决这类问题,无需导入多余jar包,新建一个异常处理类 HandleControllerAdvice:
package com.xiaohh.user.exceptions.advices; import com.xiaohh.user.constants.BizCodeEnum; import com.xiaohh.user.utils.R; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; /** * <p> * 前端统一的异常处理类 * </p> * * @author XiaoHH * @version 1.0 * @date 2021-03-04 星期四 20:17:18 * @file HandleControllerAdvice.java */ @Slf4j // 导入日志 @RestControllerAdvice(basePackages = {"com.xiaohh.user.controllers"}) // 标注这是一个统一的异常处理类 public class HandleControllerAdvice { /** * 处理所有异常的异常处理类 * * @param t 异常对象 * @return 返回处理结果 */ @ExceptionHandler(value = Throwable.class) public R handleThrowable(Throwable t) { // 记录一下日志 log.error(BizCodeEnum.UNKNOWN_EXCEPTION.getMessage(), t); return R.error(BizCodeEnum.UNKNOWN_EXCEPTION); } }
其中 BizCodeEnum 为一个枚举类型,类型中可以统一声明异常字符串和错误码:
package com.xiaohh.user.constants; /** * <p> * 异常统一声明 * </p> * * @author XiaoHH * @version 1.0 * @date 2021-02-22 星期一 20:03:50 * @file BizCodeEnum.java */ public enum BizCodeEnum { /** * 未知异常 */ UNKNOWN_EXCEPTION(10000, "系统未知异常"), /** * 参数校验异常 */ VALIDATE_EXCEPTION(10001, "参数格式校验失败"), /** * 数据完整性异常 */ DATA_INTEGRITY_VIOLATION_EXCEPTION(10002, "数据完整性校验失败"), /** * SQL 语句错误 */ BAD_SQL_GRAMMAR_EXCEPTION(10003, "SQL 语句错误"); /** * 错误码 */ private int code; /** * 错误信息 */ private String message; /** * @param code 错误码 * @param message 错误信息 */ BizCodeEnum(int code, String message) { this.code = code; this.message = message; } /** * 获取错误码 * * @return 错误码 */ public int getCode() { return code; } /** * 获取错误信息 * * @return 错误信息 */ public String getMessage() { return message; } }
可以看到我们抛出了系统未知异常,错误码为 10000,接下来我们继续发送请求测试:
可以发现已经处理了,处理 Throwable 可以处理所有的异常,但是不大准确,我们可以看到所抛出的异常为:DataIntegrityViolationException
我们建立一个处理这个异常的处理器:
/** * 处理数据完整性异常 * @param e 异常对象 * @return 返回结果 */ @ExceptionHandler(value = DataIntegrityViolationException.class) public R handleDataIntegrityViolationException(DataIntegrityViolationException e) { log.error(BizCodeEnum.DATA_INTEGRITY_VIOLATION_EXCEPTION.getMessage(), e); return R.error(BizCodeEnum.DATA_INTEGRITY_VIOLATION_EXCEPTION); }
我们再次测试:
好啦,那么我们现在错误定位就精准了,如果还有什么异常唱着上面写,没得问题的,下课。
代码已经同步到 git 仓库了哦
精彩预告(更新预告)
- 使用maven快速搭建SpringBoot的SSM项目
- 根据环境选择不同的配置,如开发环境一套配置,测试环境一套生产环境又一套
- 整合 RestControllerAdvice 做异常统一处理,坚决不把异常抛出给前端
- 整合 Spring Validated 做数据校验
- 整合 redis 做数据缓存
- 整合 Spring Cloud 做微服务注册调用