使用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异常来区分具体是违反了哪个数据库完整性约束,进而抛出有意义的业务层异常呢?
不知这样表达能否说清楚

解决方案 »

  1.   

    自顶一下,等大牛ing...
      

  2.   

    写一个异常封装类  MessageException 具体自己定义   例如
     catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();

    throw new MessageException(CommonCode.INTERNAL_ERROR, CommonCode.getCodeDesc(CommonCode.INTERNAL_ERROR));
    }
      

  3.   

    个人觉得你这个东西不应该放在这里处理,如果有类似数据为空的校验应该放在web层,服务端放在controller里面参数传入的时候取校验并处理,实在不应该让这样的异常在dao抛出来然后再去处理,性能上不好。
    如果是唯一校验的话可以让数据库的唯一索引来解决,然后抛异常出来,如果想知道那个字段发生异常恐怕不是抛出来的异常应该解决的问题,可以放在数据插入之前用查询。
    个人简介,望采纳!
      

  4.   

    分享一个ORM框架,Bee框架,一个十分钟即可学会的ORM框架.   有着直接操作实体对象的简便性,也可以方便地自己写sql执行.
    https://blog.csdn.net/abckingaa/article/details/81176524