权限不足场景下对应的正确SQLException及Spring Data异常是什么?
结论
该异常转换是Spring JDBC异常映射规则的标准行为,属于有意设计的范畴,映射逻辑完全基于JDBC规范定义的SQL状态码分类。
规则说明
- JDBC规范将
42开头的SQL状态码统一归类为语法错误或访问规则违规大类,权限错误对应的SQLSTATE 42000确实属于该分类。 - MySQL 8.x版本的JDBC驱动会根据SQL状态码抛出对应的
java.sql标准异常,42000对应的就是SQLSyntaxErrorException,Spring的默认异常转换器接收到该异常后,会按照预设规则转换为BadSqlGrammarException。 - 适配权限场景的内置异常为
org.springframework.dao.PermissionDeniedDataAccessException,该类是DataAccessException的子类,专门用于数据访问权限不足的场景。
自定义区分方案
如果需要将权限错误和实际SQL语法错误做区分,可自定义SQLExceptionTranslator,识别MySQL专属错误码做特殊转换,示例实现如下:
public class CustomSQLExceptionTranslator implements SQLExceptionTranslator { // 复用默认转换器处理其他异常 private final SQLExceptionTranslator defaultTranslator = new SQLErrorCodeSQLExceptionTranslator(); @Override public DataAccessException translate(String task, String sql, SQLException ex) { // 匹配MySQL表/列访问权限拒绝的错误码1142、1143 if (ex.getErrorCode() == 1142 || ex.getErrorCode() == 1143) { return new PermissionDeniedDataAccessException(ex.getMessage(), ex); } return defaultTranslator.translate(task, sql, ex); } }
将该自定义转换器注册到JdbcTemplate的exceptionTranslator属性即可生效。
内容的提问来源于stack exchange,提问作者Jens Møller
相关产品推荐
相关产品推荐

