易筋SpringBoot 2.1 | 第十八篇:SpringBoot的JDBC异常
写作时间:2019-08-18
Spring Boot: 2.1 ,JDK: 1.8, IDE: IntelliJ IDEA
说明
一致异常层级结构(Consistent Exception Hierarchy):
Spring提供了以DataAccessException为异常基类。所有的数据库操作异常信息都会包括在异常基类中,不用担心异常信息的丢失.
DataAccessException继承图解
Spring怎么认识错误码的
通过SQLErrorCodeSQLExceptionTranslator解析错误码
ErrorCode 定义
- org/springframework/jdbc/support/sql-error-codes.xml
- Classpath 下的 sql-error-codes.xml
SQLErrorCodes 源码位置
SQLErrorCodes 源码位置
org.springframework.jdbc.support.SQLErrorCodes
public class SQLErrorCodes {@Nullableprivate String[] databaseProductNames;private boolean useSqlStateForTranslation = false;private String[] badSqlGrammarCodes = new String[0];private String[] invalidResultSetAccessCodes = new String[0];private String[] duplicateKeyCodes = new String[0];private String[] dataIntegrityViolationCodes = new String[0];private String[] permissionDeniedCodes = new String[0];private String[] dataAccessResourceFailureCodes = new String[0];private String[] transientDataAccessResourceCodes = new String[0];private String[] cannotAcquireLockCodes = new String[0];private String[] deadlockLoserCodes = new String[0];private String[] cannotSerializeTransactionCodes = new String[0];@Nullableprivate CustomSQLErrorCodesTranslation[] customTranslations;@Nullableprivate SQLExceptionTranslator customSqlExceptionTranslator;...
}
注释:
- databaseProductNames 数据库名字
- badSqlGrammarCodes 语法错误码
- duplicateKeyCodes 重复主键
错误码配置信息
org.springframework.jdbc.support.sql-error-codes.xml
<bean id="H2" class="org.springframework.jdbc.support.SQLErrorCodes"><property name="badSqlGrammarCodes"><value>42000,42001,42101,42102,42111,42112,42121,42122,42132</value></property><property name="duplicateKeyCodes"><value>23001,23505</value></property><property name="dataIntegrityViolationCodes"><value>22001,22003,22012,22018,22025,23000,23002,23003,23502,23503,23506,23507,23513</value></property><property name="dataAccessResourceFailureCodes"><value>90046,90100,90117,90121,90126</value></property><property name="cannotAcquireLockCodes"><value>50200</value></property>
</bean>
注释:上面展示了H2的配置信息
工程建立
参照教程【SpringBoot 2.1 | 第一篇:构建第一个SpringBoot工程】新建一个Spring Boot项目,名字叫demodberrorcode, 在目录src/main/java/resources
下找到配置文件application.properties
,重命名为application.yml
。
在Dependency中选择
Developer Tools > Lombok
Web > Spring Web Starter
SQL > H2 DataBase / JDBC API
Ops > Spring Boot Actuator。
设置日志打印格式化ANSI
ANSI - American National Standards Institute
Support classes to provide ANSI color output.
src > main > resources > application.yml
spring:output:ansi:enabled: always
创建表Foo
路径 src > main > resources > schema.sql
CREATE TABLE FOO (ID INT IDENTITY, BAR VARCHAR(64));
自定义异常类
com.zgpeace.demodberrorcode.CustomDuplicatedKeyException
package com.zgpeace.demodberrorcode;import org.springframework.dao.DuplicateKeyException;public class CustomDuplicatedKeyException extends DuplicateKeyException {public CustomDuplicatedKeyException(String msg) {super(msg);}public CustomDuplicatedKeyException(String msg, Throwable cause) {super(msg, cause);}
}
自定义错误码配置
路径 src > main > resources > sql-error-codes.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd"><beans><bean id="H2" class="org.springframework.jdbc.support.SQLErrorCodes"><property name="badSqlGrammarCodes"><value>42000,42001,42101,42102,42111,42112,42121,42122,42132</value></property><property name="duplicateKeyCodes"><value>23001,23505</value></property><property name="dataIntegrityViolationCodes"><value>22001,22003,22012,22018,22025,23000,23002,23003,23502,23503,23506,23507,23513</value></property><property name="dataAccessResourceFailureCodes"><value>90046,90100,90117,90121,90126</value></property><property name="cannotAcquireLockCodes"><value>50200</value></property><property name="customTranslations"><bean class="org.springframework.jdbc.support.CustomSQLErrorCodesTranslation"><property name="errorCodes" value="23001,23505"/><property name="exceptionClass"value="com.zgpeace.demodberrorcode.CustomDuplicatedKeyException"/></bean></property></bean></beans>
Controller UnitTesst
com.zgpeace.demodberrorcode.DemodberrorcodeApplicationTests
package com.zgpeace.demodberrorcode;import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.junit4.SpringRunner;@RunWith(SpringRunner.class)
@SpringBootTest
public class DemodberrorcodeApplicationTests {@Autowiredprivate JdbcTemplate jdbcTemplate;@Test(expected = CustomDuplicatedKeyException.class)public void testThrowingCustomException() {jdbcTemplate.execute("INSERT INTO FOO (ID, BAR) VALUES (1, 'A')");jdbcTemplate.execute("INSERT INTO FOO (ID, BAR) VALUES (1, 'B')");}@Testpublic void testThrowingException() {jdbcTemplate.execute("INSERT INTO FOO (ID, BAR) VALUES (1, 'A')");jdbcTemplate.execute("INSERT INTO FOO (ID, BAR) VALUES (1, 'B')");}}
注释:
- 方法testThrowingCustomException()运行通过,因为自定义异常,没有处理重复主键的问题。
- 方法testThrowingException() 报重复主键异常
com.zgpeace.demodberrorcode.CustomDuplicatedKeyException:
StatementCallback: Unique index or primary key violation:
"PRIMARY KEY ON PUBLIC.FOO(ID) [1, 'A']"; SQL statement:
INSERT INTO FOO (ID, BAR) VALUES (1, 'B') [23505-199];
nested exception is org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException:
Unique index or primary key violation: "PRIMARY KEY ON PUBLIC.FOO(ID) [1, 'A']"; SQL statement:
INSERT INTO FOO (ID, BAR) VALUES (1, 'B') [23505-199]
总结
恭喜你,学会了SpringBoot的JDBC异常自定义错误码处理。
代码下载:
https://github.com/zgpeace/Spring-Boot2.1/tree/master/db/demodberrorcode
参考
https://docs.spring.io/spring/docs/current/spring-framework-reference/data-access.html#dao
https://github.com/geektime-geekbang/geektime-spring-family/tree/master/Chapter%202/errorcode-demo
易筋SpringBoot 2.1 | 第十八篇:SpringBoot的JDBC异常相关推荐
- 2021年安全生产工作总结及2022年思路计划(二十八篇)PPTX(附下载)
摘要:2021年安全生产工作总结及2022年思路计划(二十八篇) 公众号:安全生产星球
- 实习日志_实习律师实习日志第十八篇(连载30篇)
提供实习律师实习日记相关的文章资讯,希望我的分享能让您感到满意! 这个月接触最多的是人身损害赔偿的一些案件,交通事故.工伤的一些案件最多.起初,以为这些案件就是走走法律流程便可了事,最简单不过,可当完 ...
- SpringBoot第十八篇: 定时任务(Scheduling Tasks)
这篇文章将介绍怎么通过spring去做调度任务. 构建工程 创建一个Springboot工程,在它的程序入口加上@EnableScheduling,开启调度任务. @SpringBootApplica ...
- 第六十八篇:从ADAS到自动驾驶(一):自动驾驶发展及分级
作者:liaojiacai 邮箱: ljc_v2x_adas@foxmail.com 从ADAS到自动驾驶(一):自动驾驶的发展及分级 从今天起,我将根据自己所接触的ADAS和无人驾驶技术,来 ...
- SpringBoot非官方教程 | 第二十六篇: sprinboot整合elk,搭建实时日志平台
转载请标明出处: 原文首发于https://www.fangzhipeng.com/springboot/2017/07/11/sprinboot25-elk/ 本文出自方志朋的博客 这篇文章主要介绍 ...
- “约见”面试官系列之常见面试题之第八十八篇之什么是vue生命周期(建议收藏)
我们知道vue是一个构建数据驱动的 web 界面的渐进式框架,那么vue生命周期是什么呢?本篇文章就给大家来介绍一下vue生命周期的内容,希望可以帮助到有需要的朋友. vue生命周期是什么? Vue生 ...
- 第十八篇,Simulink with Git
一.综述 本篇以MATLAB R2021b为基础讲解如何对Simulink模型做Git管理,mdl与slx均可. Git并非只能对手写代码做版本管理,它的应用十分广泛,囊括了各种使用编程语言编写的代码 ...
- 第十八篇:Question Answering问答系统
目录 介绍 事实问题 非事实问题 为什么我们关注 NLP 中的事实问题? 2 种关键方法 大纲 IR-based QA 基于 IR 的 事实(Factoid) QA:TREC-QA 问题处理 答案类型 ...
- 七十八、SpringBoot监听rabbitmq和创建交换器,队列
@Author:Runsen 来源:尚硅谷 下面建议读者学习尚硅谷的B站的SpringBoot视频,我是学雷丰阳视频入门的. 具体链接如下:B站尚硅谷SpringBoot教程 文章目录 AmqpAdm ...
- WPF效果第一百七十八篇ItemsControl旋转
在前面分享的几篇中咱已经玩耍了Popup.ListBox多选.Grid动态分.RadioButton模板.控件的拖放效果.控件的置顶和置底.控件的锁定.自定义Window样式.动画效果.Expande ...
最新文章
- MAX2606调频发射芯片
- SUBMIT 的使用方法
- Linux监控 Nagios
- [原]详解如何将cocos2dx项目编译到Android平台上的(方式一:Cywin+NDK)
- oracle group by sql,Oracle SQL GROUP BY“不是GROUP BY表达式”的帮助
- ubuntu安装scala开发环境
- 问题 | kali2019.04版中文语言安装后就会乱码
- 编写python代码估算sin(x)的值
- 鸟哥的Linux私房菜-合集
- TouchPanel--ESD_Check
- Zune软件教程 Windows Phone同步攻略
- oracle8ora-00059,ORA-00059错误分析以及MAXDATAFILES、DB_FILES参数修改
- {转载}与我十年长跑的女朋友就要嫁人了。
- Laravel框架中使用 Repository 模式
- 关于excel导出日期格式变化问题处理
- Python创建文件夹和子文件夹
- 房天下二手交易平台房源数据采集
- Educoder中题目:泰坦尼克生还预测——可视化与探索性数据分析
- Tiny RTC DS1307 时钟模块 完整代码(Arduino)及一些要注意的地方
- 学习STM32单片机之结构体思想