使用spring+mybatis操作数据库时,如果发生数据库异常,则spring dao会抛出与特定数据库技术不相关的org.springframework.dao.DataAccessException类的子类异常,避免系统与某种特殊的持久层实现耦合在一起。DataAccessException异常类结构如下(具体异常说明可参考此链接https://blog.csdn.net/xys_777/article/details/5298757):那么server层调用dao发生DataAccessException异常时,如何将这些异常封装为特定的有意义的业务异常?
比如说user表插入数据时,username字段有唯一性约束、password和birthday字段有非空约束,那么当插入的数据同时不满足这三个约束时,会抛出DataIntegrityViolationException异常,但我想在service层将此异常封装为有意义的异常(比如说username已存在异常、password为空异常、birthday为空异常)后throw给controller,那么怎么才能从DataIntegrityViolationException异常来区分具体是违反了哪个数据库完整性约束,进而抛出有意义的业务层异常呢?
不知这样表达能否说清楚
比如说user表插入数据时,username字段有唯一性约束、password和birthday字段有非空约束,那么当插入的数据同时不满足这三个约束时,会抛出DataIntegrityViolationException异常,但我想在service层将此异常封装为有意义的异常(比如说username已存在异常、password为空异常、birthday为空异常)后throw给controller,那么怎么才能从DataIntegrityViolationException异常来区分具体是违反了哪个数据库完整性约束,进而抛出有意义的业务层异常呢?
不知这样表达能否说清楚
catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new MessageException(CommonCode.INTERNAL_ERROR, CommonCode.getCodeDesc(CommonCode.INTERNAL_ERROR));
}
如果是唯一校验的话可以让数据库的唯一索引来解决,然后抛异常出来,如果想知道那个字段发生异常恐怕不是抛出来的异常应该解决的问题,可以放在数据插入之前用查询。
个人简介,望采纳!
https://blog.csdn.net/abckingaa/article/details/81176524