当前位置:网站首页 > Java基础 > 正文

java教程303



 
  

在业务层中做如下的处理,模拟异常的产生:

 
  
 
  

为了不在controller中写大量的try catch因为我们需要全局统一异常处理。

Spring Boot 默认会处理所有未被处理的异常,将其转换为 HTTP 响应并返回客户端。但是,我们希望能够自定义响应格式、统一异常处理以便做到更好的异常管理。

要实现全局异常处理,我们需要写一个类并使用 @ControllerAdvice 注解:

 
  

细节说明:

  • 注解用于标记全局异常处理类。
  • 注解用于标记需要处理的异常类型。
  • 注解用于指定响应体格式为 json。
  • 为我们自定义的响应格式。
如果返回的都是JSON格式,可以直接在类上使用@RestControllerAdvice

最后在我们的异常类中,可以通过 抛出异常,并在全局异常中处理。例如:

 
  

到这里,我们已经实现了全局异常处理。当发生异常时,会进入 类中的相应方法进行异常处理,并返回指定格式的响应。

在Java中,通常使用枚举类型来定义统一的错误码。这样可以方便地管理、扩展和维护各种错误码,同时也可以避免使用魔术数的风险。同时我们可以约束好统一的错误码描述,更好的展示给前端开发人员,但是前端人员主要通过错误码来进行判断,描述只是起到一个解释作用。

下面是一个简单的示例:

 
  

Java 枚举中没有 setter 方法。枚举是一种特殊的类,它的实例在定义时就已经被确定,所以不需要 setter 方法来修改其属性值。枚举中的实例属性应该被定义为 final 类型的字段,这样就保证其值不会被修改。

那么接下来想要给前端统一返回错误码以及错误描述,就需要优化我们的统一异常处理器了,增加一个自定义的异常:

 
  

在可能出问题的地方抛出自定义异常:

 
  

但是我们的全局异常处理器并没有去捕获该自定义异常,因此我们还需要优化:

 
  
 
  

如果每次抛异常都要这样写很长的方式,其实并不优雅:

 
  

其实我们的自定义异常该构造方法中也无法就是将接收到的两个值继续赋值给异常类中的code和message,如下:

 
  
 
  

那我们后续抛异常,直接如下就很优雅简单了:

 
  

  • 参数校验是程序开发中必不可少的步骤,用户在前端页面上填写表单时,前端js程序会校验参数的合法性,当数据到了后端,为了防止恶意操作,保持程序的健壮性,后端同样需要对数据进行校验,后端参数校验最简单的做法是直接在业务方法里面进行判断,当判断成功之后再继续往下执行,但这样带给我们的是代码的耦合,冗余。当我们多个地方需要校验时,我们就需要在每一个地方调用校验程序,导致代码很冗余,且不美观
  • JSR303就是为了优美的参数校验出现的

  • Bean Validation中内置的constraint
Constraint 详细信息 被注释的元素必须为 被注释的元素必须不为 被注释的元素必须为 被注释的元素必须为 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 被注释的元素的大小必须在指定的范围内 被注释的元素必须是一个数字,其值必须在可接受的范围内 被注释的元素必须是一个过去的日期 被注释的元素必须是一个将来的日期 被注释的元素必须符合指定的正则表达式
  • Hibernate Validator 附加的 constraint
Constraint 详细信息 被注释的元素必须是电子邮箱地址 被注释的字符串的大小必须在指定的范围内 被注释的字符串的必须非空 被注释的元素必须在合适的范围内

  • JSR303所需要的Jar包
 
  
  • 在spring-boot-starter-web中有上述Jar包
 
  

  • 字段可以加在实体类字段上,也可以加在方法参数前
  • 要求如下:
    • 姓名、电话、邮箱不能为空
    • 电话、邮箱格式需要正则校验
  • 代码实现:
 
  
  • 在接口接收参数上添加@Valid注解进行校验:
 
  

测试后结果:

 
  

OK,以上就为搭建全局异常处理+错误码枚举+JSR303校验整合的完整内容。大家写好后在公司的各个项目中都可以直接引入快速使用。

  • 上一篇: 手机java登录教程
  • 下一篇: java按键教程
  • 版权声明


    相关文章:

  • 手机java登录教程2026-01-20 22:10:06
  • eclipse安装Java教程2026-01-20 22:10:06
  • java 使用教程2026-01-20 22:10:06
  • 老外java教程2026-01-20 22:10:06
  • java连接教程2026-01-20 22:10:06
  • java按键教程2026-01-20 22:10:06
  • java commons io教程2026-01-20 22:10:06
  • java junit 教程2026-01-20 22:10:06
  • java中算法教程2026-01-20 22:10:06
  • java动态教程视频2026-01-20 22:10:06