时间有些紧迫,所以文中有些待考证的地方还未进行测验深究,大家见谅。
自己造算是了个轮子,个人感觉这个轮子以后很多地方都会用到的吧。
需求起因:
这两天刚开始写SpringBoot,用到了JPA的东西,然后对于后端处理业务比较重要的一块就是参数的校验。个人目前看来校验分两类,第一类是类似Validator的东西,就是根据输入的参数直接在实体上设定好规则,然后传入参数的时候进行检验合理性,比如NotNull(目前仅用到了于javax包下的validation里面的那些constraints),出现异常就抛出。第二类就是涉及到数据库的一种校验,比如Unique校验,据我目前所知好像hibernate本身是没有替我们进行数据库比对,所以涉及到数据库中的校验就需要自己来限制了。
然后在网上看到了关于统一异常处理机制的东西,用途就是对于各种校验产生的异常,也需要像其他封装好的数据一样,对前台展示统一的数据。第二类的校验由于涉及到了数据库,所以一般的操作就是自己查一下数据库,然后如果发现异常就手动返回一个正规数据,并不是真正意义上的异常。这种方式返回异常的时候可能跟原来差不太多,可能不够优雅?不对。好像是这么做不调用异常的话,涉及到事务的情况好像是没办法回滚的。(事务这块也有待考证,网上有的说只有没被捕获的RuntimeException才能触发事务回滚)补充:实验测试,首先开启事务必须要声明 @Transactional(方法级) 注解,然后抛出的继承的继承RuntimeException就可以触发回滚,之前提到的捕获应该指的是try catch的捕获,前后文的异常捕获器并不会导致事务不会回滚。
而对于第一类的异常,toString出来的对象就比较麻烦了。对于我这种刚写Spring两三天的人,给我那么那么多数据我也没啥用,也看不懂。但是里面的错误原因,也就是之前我在参数校验时候自定义的返回数据却是我想要的。按照常规的做法是,在Controller层绑定一个BindingResult的对象,跟@Valid和其他请求参数一起传进来,然后再在BindingResult里头挨个处理,遍历拿出来结果进行获取。这样才能对结果进行定制处理,不然只能在控制台报一些神仙错误。想一下这时候就会发现,对于参数验证的报错和对BindingResult的处理会再每个Controller里头都写一次吧差不多。因为要返回统一的错误数据嘛。异常捕获机制就显得雪中送炭了这时候。
这时候在网上看到了关于一些统一异常处理的东西,里面用到了全局异常捕获器。就是对于某些特有的异常,可以做特有的处理。找到控制台对于参数校验的一些异常,然后在捕获器里头进行捕获,特别处理。嗯逻辑好简单,哇,迷了我几个小时的东西隔一天一看就变得。。没那么有成就感了。然后就可以抛出的异常进行统一的返回数据了。并且在Controller里面,就不需要开发人员再对参数的异常进行管理了
附上代码:
全局异常捕获器
统一返回数据类型
自定义异常处理类
最后希望踩我的同学出来交流一下,个人也是小白一枚~希望指点
有关的项目源码在我的个人项目中均可以找到,甚至发现更神奇的东西噢~(在线表单项目,可自定义表单组件)
小的在此请大家闲暇之余赏个Star嘻嘻嘻
https://github.com/syhdeclan/OnlineFormJava