文档说明
开发步骤
我们接着上面这个项目继续,先来看看表的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"}
可以发现密码是为空的,那么后端的返回就是:
然后前端一脸懵逼直接说后端技术不行,今天就教你怎么解决这类问题,无需导入多余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 做微服务注册调用