在业务层中做如下的处理,模拟异常的产生:
当我们通过浏览器去访问的时候得到的结果就是这样的:
这样是肯定不适合的,我们应该返回统一的错误处理,并且交代清楚错误的类型,交给前端进行统一错误页面展示。并且在我们的controller中要捕获对应的异常:
为了不在controller中写大量的try catch因为我们需要全局统一异常处理。
Spring Boot 默认会处理所有未被处理的异常,将其转换为 HTTP 响应并返回客户端。但是,我们希望能够自定义响应格式、统一异常处理以便做到更好的异常管理。
要实现全局异常处理,我们需要写一个类并使用 @ControllerAdvice 注解:
细节说明:
- 注解用于标记全局异常处理类。
- 注解用于标记需要处理的异常类型。
- 注解用于指定响应体格式为 json。
- 为我们自定义的响应格式。
如果返回的都是JSON格式,可以直接在类上使用@RestControllerAdvice
最后在我们的异常类中,可以通过 抛出异常,并在全局异常中处理。例如:
到这里,我们已经实现了全局异常处理。当发生异常时,会进入 类中的相应方法进行异常处理,并返回指定格式的响应。
在Java中,通常使用枚举类型来定义统一的错误码。这样可以方便地管理、扩展和维护各种错误码,同时也可以避免使用魔术数的风险。同时我们可以约束好统一的错误码描述,更好的展示给前端开发人员,但是前端人员主要通过错误码来进行判断,描述只是起到一个解释作用。
下面是一个简单的示例:
Java 枚举中没有 setter 方法。枚举是一种特殊的类,它的实例在定义时就已经被确定,所以不需要 setter 方法来修改其属性值。枚举中的实例属性应该被定义为 final 类型的字段,这样就保证其值不会被修改。
那么接下来想要给前端统一返回错误码以及错误描述,就需要优化我们的统一异常处理器了,增加一个自定义的异常:
在可能出问题的地方抛出自定义异常:
但是我们的全局异常处理器并没有去捕获该自定义异常,因此我们还需要优化:
最后查看日志:
至此全局统一异常处理搭建完毕,后续根据自己项目中的需求进行扩展和优化即可。
如果每次抛异常都要这样写很长的方式,其实并不优雅:
其实我们的自定义异常该构造方法中也无法就是将接收到的两个值继续赋值给异常类中的code和message,如下:
那我们后续抛异常,直接如下就很优雅简单了:
- 参数校验是程序开发中必不可少的步骤,用户在前端页面上填写表单时,前端js程序会校验参数的合法性,当数据到了后端,为了防止恶意操作,保持程序的健壮性,后端同样需要对数据进行校验,后端参数校验最简单的做法是直接在业务方法里面进行判断,当判断成功之后再继续往下执行,但这样带给我们的是代码的耦合,冗余。当我们多个地方需要校验时,我们就需要在每一个地方调用校验程序,导致代码很冗余,且不美观
- JSR303就是为了优美的参数校验出现的
- Bean Validation中内置的constraint
- Hibernate Validator 附加的 constraint
- JSR303所需要的Jar包
- 在spring-boot-starter-web中有上述Jar包
- 字段可以加在实体类字段上,也可以加在方法参数前
- 要求如下:
- 姓名、电话、邮箱不能为空
- 电话、邮箱格式需要正则校验
- 代码实现:
- 在接口接收参数上添加@Valid注解进行校验:
测试后结果:
OK,以上就为搭建全局异常处理+错误码枚举+JSR303校验整合的完整内容。大家写好后在公司的各个项目中都可以直接引入快速使用。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/java-jiao-cheng/8708.html