我们的校验框架通常用于DTO层,用户从前端通过Json串传入值,后端对传入的Json封装到DTO层中,我们对DTO层的元素进行校验,比如邮箱,手机号等等。

首先需要引入bean校验需要的jar包:

<!-- Validation 相关依赖 --><dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId><version>2.0.1.Final</version></dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>6.0.16.Final</version></dependency><dependency><groupId>javax.el</groupId><artifactId>javax.el-api</artifactId><version>3.0.0</version></dependency><dependency><groupId>org.glassfish.web</groupId><artifactId>javax.el</artifactId><version>2.2.6</version></dependency>

怎么用?看下面的例子

@Data
public class UserDTO implements Serializable {/*** serialVersionUID*/private static final long serialVersionUID = -5087359471567830690L;/*** 用户名*/@NotBlank(message = "用户名不能为空!",groups = {InsertValidationGroup.class})private String username;/*** 用户密码*/@NotBlank(message = "密码不能为空!",groups = {InsertValidationGroup.class})@Length(min = 6, max = 18,message = "密码长度不能少于6位,不能多于18位!")private String password;/*** 邮箱*/@NotEmpty(message = "邮箱不能为空!",groups = {InsertValidationGroup.class})@Email(message = "必须为有效邮箱!")private String email;/*** 年龄*/@NotNull(message = "年龄不能为空!",groups = {InsertValidationGroup.class})@Max(value = 60, message = "年龄不能大于60岁!")@Min(value = 18, message = "年龄不能小于18岁!")private Integer age;/*** 手机号*/@NotBlank(message = "手机号不能为空!",groups = {InsertValidationGroup.class})private String phone;/*** 版本号*/@NotNull(message = "版本号不能为空!",groups = {UpdateValidationGroup.class})private Long version;/*** 创建时间*/private LocalDateTime created;

如果没有遵循校验框架的注解,就会抛出message中的异常信息。

常用的约束注解:

  • 空值校验类: @Null, @NotNull, @NotEmpty, @NotBlank等
  • 范围校验类: @Min, @Size, @Digits, @Future, @Negative等
  • 其他校验类: @Email, @URL, @AssertTrue, @Pattern等

上面可以看到groups=UpdateValidationGroup.classgroups = {UpdateValidationGroup.class}groups=UpdateValidationGroup.class的代码,这个是分组校验。也就是说,比如主键注册的时候的无需填入,可以为空值,不需要在插入的时候校验。比如上面的版本号(乐观锁),只是在更新的时候校验。控制层可以这么写:

public ResponseResult update(@NotNull @PathVariable("id") Long id,@Validated(UpdateValidationGroup.class)@RequestBody UserDTO userDTO) {int update = userService.update(id, userDTO);if (update == 1) {return ResponseResult.success("更新成功!");} else {return ResponseResult.failure(ErrorCodeEnum.UPDATE_FAILURE);}}

当然,还需要创建两个空的接口分组:

public interface UpdateValidationGroup {}
public interface InsertValidationGroup {}

我们还可以自定义校验注解:

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;/*** 自定义手机号约束注解*/
@Documented
// 注解的作用
@Target({ElementType.FIELD})
// 注解的保留策略
@Retention(RetentionPolicy.RUNTIME)
// 与非约束注解的不同之处
// 约束注解关联验证器类
@Constraint(validatedBy = PhoneValidator.class)
public @interface Phone {// 约束注解验证时输出的信息String message() default "手机号校验错误";// 约束注解在验证时所属的组别Class<?>[] groups() default {};// 约束注解的有效负载Class<? extends Payload>[] payload() default {};
}/*** 自定义手机号约束注解关联验证器*/
public class PhoneValidator implements ConstraintValidator<Phone, String> {/*** 自定义校验逻辑方法* @param s* @param constraintValidatorContext* @return*/@Overridepublic boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {// 演示demo// 手机号验证规则 158...String check = "158\\d{8}";Pattern regex = Pattern.compile(check);String phone = Optional.ofNullable(s).orElse("");Matcher matcher = regex.matcher(phone);return matcher.matches();}
}

我们捕捉到了异常之后,下面对异常进行统一的处理:

@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {/*** 拦截业务类异常* @param e* @return*/@ResponseBody@ExceptionHandler(value = BusinessException.class)public ResponseResult businessExceptionHandle(BusinessException e) {log.error("捕捉到业务类异常:", e);return ResponseResult.failure(e.getCode(), e.getMessage());}/*** 拦截运行时异常* @param e*/@ResponseBody@ExceptionHandler(value = RuntimeException.class)public ResponseResult runtimeExceptionHandle(RuntimeException e) {log.error("捕捉到运行时异常:", e);return ResponseResult.failure(ErrorCodeEnum.UNKNOWN_ERROR.getCode(),e.getMessage());}/*** 捕捉系统级异常* @param th* @return*/@ResponseBody@ExceptionHandler(value = Throwable.class)public ResponseResult throwableHandle(Throwable th) {log.error("捕捉Throwable异常:", th);return ResponseResult.failure(ErrorCodeEnum.SYSTEM_ERROR.getCode(),th.getMessage());}}

统一的结果封装:

@Data
@ApiModel(value = "统一返回结果实体",description = "封装统一返回结果信息实体"
)
public class ResponseResult<T> implements Serializable {/*** serialVersionUID*/private static final long serialVersionUID = 7813356989387725160L;/*** 是否成功*/@ApiModelProperty(name = "success",value = "是否成功",required = true,dataType = "Boolean")private Boolean success;/*** 编码*/@ApiModelProperty(name = "code",value = "编码",required = false,dataType = "String")private String code;/*** 描述信息*/@ApiModelProperty(value = "描述信息")private String message;/*** 结果*/@ApiModelProperty(value = "泛型结果T")private T result;/*** 成功* @param result* @param <T>* @return*/public static <T> ResponseResult<T> success(T result) {ResponseResult<T> responseResult = new ResponseResult<>();responseResult.setSuccess(Boolean.TRUE);responseResult.setResult(result);return responseResult;}/*** 失败* @param code* @param message* @param <T>* @return*/public static <T> ResponseResult<T> failure(String code, String message) {ResponseResult<T> responseResult = new ResponseResult<>();responseResult.setSuccess(Boolean.FALSE);responseResult.setCode(code);responseResult.setMessage(message);return responseResult;}/*** 失败* @param codeEnum* @param <T>* @return*/public static <T> ResponseResult<T> failure(ErrorCodeEnum codeEnum) {return failure(codeEnum.getCode(), codeEnum.getMessage());}
}

Springboot Bean Validation校验框架相关推荐

  1. 粉丝说SpringBoot集成validation校验参数有坑,我试了试

    公众号中分享了一篇文章,关于SpringBoot集成validation校验参数的,粉丝留言说有坑. 原留言如下: 有坑,你试试^A-\\d{12}-\\d{4}$,这条正则经过validate这个方 ...

  2. bean validation校验方法参数_SpringBoot参数校验 从入门到精通 解决繁琐的参数验证工作...

    ● 手把手教你实现 SpringBoot与Vue整合开发 前后端分离 简单例子 详解●SQL优化经历  SQL执行效率提高了1000w倍●Java面试题 详解 由易到难● SQL语句大全详解 增删改查 ...

  3. springboot 配置 Validator 校验框架国际化 支持快速返回

    1.国际化资源 使用IDEA创建资源组 2.编写配置 application.yml 增加国际化目录配置 增加国际化配置类 从请求头获取多语言关键字 /*** 国际化配置** @author Lion ...

  4. Bean Validation 校验实践

    前言 在应用程序的业务逻辑中,经常会碰到需要校验参数的情况. 经常要判断一个 Model 的字段是否为 Null 之类,或者判断长度等. 那么在代码层面上,就会需要编写很多校验,影响代码的阅读以及维护 ...

  5. bean validation校验方法参数_Spring Boot 之使用 validation 验证参数

    前言 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/bin392328206/six-finger种一棵树最好的时间是十年前,其次是现在 我知道很多人不玩qq了 ...

  6. bean validation校验方法参数_Springboot 使用校验框架validation校验

    作者:双斜杠少年 blog.csdn.net/u012373815/article/details/72049796 b/s系统中对http请求数据的校验多数在客户端进行,这也是出于简单及用户体验性上 ...

  7. bean validation校验方法参数_Spring Validation最佳实践及其实现原理,参数校验没那么简单!

    本文同名博客老炮说Java:https://www.laopaojava.com/,每天更新Spring/SpringMvc/SpringBoot/实战项目等文章资料 顺便再给大家推荐一套Spring ...

  8. bean validation校验方法参数_项目启动时首先校验Spring Boot配置参数

    1. 概述 在项目实际开发过程中,为了更好的复用,我们参考Spring Boot Starters,封装了许多企业内部中间件的starter.这些中间件的接入都需要申请并在项目中配置一些特定的参数.我 ...

  9. spring boot2.3.1版本导入spring-boot-starter-web没有validation校验框架的解决办法

    导入 我们发现下面的包飘红 再查看spring boot2.3.1版本导入spring-boot-starter-web底下确实没有validation 解决办法 需要手动加入validation的依 ...

最新文章

  1. 剑指offer:链表中环的入口结点
  2. android 启动过程
  3. Kubernetes 入门(4)集群配置
  4. android开发入门
  5. ACE总监侯圣文全面解析特训方法
  6. matlab输出高质量图片,Matlab 画平滑轮廓 print 高质量 figure | 学步园
  7. 随想录(形式化验证小结)
  8. 创建List的应用小结
  9. 敏捷开发框架_测试经理必知必会:敏捷开发3355原则
  10. 微软自动化测试工具Playwright快速上手指南
  11. 威纶通定时循环操作宏_相同功能带定时器的PLC程序怎么简化?
  12. Bilibili缓存视频在电脑端直接打开方式
  13. 西瓜书第三章习题及答案
  14. k8s节点NotReady问题定位
  15. 多关卡连连看php源码_【Ctrl.js】快手小游戏-连连看源码
  16. 团队作业第二次——需求分析
  17. oracle数据库按中文拼音排序
  18. C# System.Net.Mail 类 使用465端口邮件不成功
  19. Deepin升级内核后无法启动的问题
  20. IaaS PaaS SaaS云服务三种应用模式

热门文章

  1. vagrant打造自己的开发环境~~我也来一发
  2. CodeVS 3027 线段覆盖2(DP)
  3. 脚本 折叠 各方向
  4. visual studio code更新
  5. 为view添加约束constraints
  6. sprintf()函数
  7. svn 合并问题 MERGE of '/svn/web': 200 OK (http://xx.xx.xx.xx)
  8. 通过meta进行重定向
  9. 基于React的全屏滑动插件react-fullslip
  10. hdu 2089 不要62【数位dp】