1. 问题
发现,username已经添加了唯一约束,不能重复。
2. 解决方案
通过全局异常处理器来处理。
java
/**
* 全局异常处理器,处理项目中抛出的业务异常
*/
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
/**
* 处理SQL异常
* @param ex
* @return
*/
@ExceptionHandler
public Result exceptionHandler(SQLIntegrityConstraintViolationException ex){
//Duplicate entry 'zhangsan' for key 'employee.idx_username'
String message = ex.getMessage();
if(message.contains("Duplicate entry")){
String[] split = message.split(" ");
String username = split[2];
String msg = username + ."已存在";
return Result.error(msg);
}else{
return Result.error("未知错误");
}
}
}
这段代码是一个 全局异常处理器,用于捕获项目中可能抛出的 SQL 相关异常,并且对特定的错误信息进行处理和反馈给前端。在大型项目中,异常处理是非常重要的一个环节。处理异常可以提升用户体验,让用户看到更有意义的提示,而不是直接让程序崩溃或者返回不友好的错误信息。
@RestControllerAdvice
:这是一个全局异常处理注解,能够捕获控制器中抛出的异常并进行处理。@ExceptionHandler
:指定了处理SQLIntegrityConstraintViolationException
异常的方法,这个异常常见于违反数据库唯一性约束时(如插入重复数据)。- 异常处理逻辑 :
- 通过
ex.getMessage()
获取异常的详细信息。 - 如果异常信息包含
"Duplicate entry"
,说明是由于重复数据引起的。 - 通过字符串分割提取出重复的字段值(如用户名),然后生成用户友好的提示信息(如
zhangsan已存在
)。 - 如果不是重复数据错误,返回通用的提示
"未知错误"
。
- 通过
3. 扩展
3.1 为什么要处理异常
- 提升用户体验:让用户看到更直观的错误提示,而不是复杂的技术信息。
- 增强安全性:避免暴露数据库内部信息,减少安全风险。
- 集中管理异常:通过全局异常处理器,能够在一个地方处理项目中所有的异常,避免在每个控制器方法中重复处理。
3.2 处理思路
- 捕获异常:统一捕获数据库异常,避免程序直接崩溃。
- 分析信息:从异常信息中提取出具体的重复字段,生成友好的提示。
- 返回响应 :通过
Result.error()
将处理后的信息返回给前端,提升用户体验。