JSR303数据校验使用方法记录
JSR303并不对应着指定的jar包,而是一种规范,目前hibernate-validator是使用最多的是基于JSR303规范的实现
本文不适合新人观看,要求至少要知道使用方法
Springboot整合JSR303的starter启动器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
正常引用hibernate-validator的依赖
<!-- 6.2.0.Final是推荐使用的版本 -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.2.0.Final</version>
</dependency>
常用注解记录
这里记录一些常见常用的注解,并非全部,如有遇到会随时补充
注解简单介绍
每个注解都包含通用属性,这里介绍一下message和groups:
| 注解 | 作用 |
|---|---|
| message | 字符串,报错后提示的错误信息 |
| groups | 接口的class属性,为校验分组 |
值类型校验
| 注解 | 作用 |
|---|---|
| @Null | 必须为Null |
| @NotNull | 必须不为Null |
| @NotBlank | 必须不为空(去除首位空格) |
| @NotEmpty | 效果等同于@NotBlank |
| @AssertTrue | 必须为true |
| @AssertFalse | 必须为false |
| @Pattren | 必须符合该正则表达式 |
| 必须是电子邮箱格式 |
范围类型校验
| 注解 | 作用 |
|---|---|
| @Min | 必须是数字且大于等于指定的数字 |
| @Max | 必须是数字且小于等于指定的数字 |
| @Range | 必须是数字且大于等于min,小于等于max |
| @DecimalMin | 必须是数字且大于等于指定的数字 |
| @DecimalMax | 必须是数字且小于等于指定的数字 |
| @Digits | 必须是数字且整数位不能超过integer位,小数位不能超过fraction位 |
| @Length | 必须是字符串且大于等于min并且小于等于max |
| @Size | 适用于字符串集合数组,长度大于等于min并且小于等于max |
| @Past | 必须是过去的日期 |
| @Future | 必须是将来的日期 |
自定义校验注解
自定义校验注解需要创建一个注解,然后加上每个校验注解都有的三个基本属性
@Documented
@Target({ METHOD, FIELD, PARAMETER })
@Retention(RUNTIME)
public @interface Phone {
String message() default "";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
现在注解就创建完成了,但是是个没用的空壳注解,想要让他拥有校验的能力需要一个类来帮他完成校验,使用@Constraint注解来指定让哪个类来帮自己完成校验
@Documented
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
// 表示要用PhoneValidate来帮自己完成校验
@Constraint(validatedBy = PhoneValidate.class)
public @interface Phone { ... }
接下来创建PhoneValidate类来帮注解完成校验规则
// 该类必须实现ConstraintValidator接口,泛型中的Phone代表生效的注解,String代表被注解的属性的类型
public class PhoneValidate implements ConstraintValidator<Phone, String> {
// private String pattern;
@Override
public void initialize(Phone annotation) {
// 这里执行优先级高,可以通过annotation获取到注解中携带的值,用于后续校验处理,例如:
// this.pattern = annotation.pattern();
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
// 通过返回true或false来决定校验是否通过
String regExp = "^((13[0-9])|(14[5,7,9])|(15[0-3,5-9])|(166)|(17[3,5,6,7,8])|(18[0-9])|(19[8,9]))\\d{8}$";
return value.matches(regExp);
}
}
全局异常处理
Contrller层的实体类加上@Valid注解后会开启参数校验,未通过校验规则会抛出异常,针对异常可以通过全局异常处理优雅的返回错误信息,这里就不写那么细了,直接将方法粘过来
@Slf4j
@RestControllerAdvice
public class ExceptionControllerAdvice {
/** JSR303参数校验失败异常 */
@ExceptionHandler(MethodArgumentNotValidException.class)
public Map<String, String> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
// 获取参数异常信息
BindingResult bindingResult = e.getBindingResult();
List<FieldError> fieldErrors = bindingResult.getFieldErrors();
// 创建Map集合,用于存储异常信息返回给页面
Map<String, String> errors = new HashMap<>();
fieldErrors.forEach(item -> errors.put(item.getField(), item.getDefaultMessage()));
return errors;
// 这个R是自己项目中封装的通用返回模板
// return R.error(BizCodeMenu.VALID_EXCEPTION).put("data", errors);
}
}
JSR303数据校验使用方法记录的更多相关文章
- [SpringBoot] - 配置文件的多种形式及JSR303数据校验
Springboot配置文件: application.yml application.properties(自带) yml的格式写起来稍微舒服一点 在application.properties ...
- YAML语法使用,JSR303数据校验
YAML YAML是 "YAML Ain't a Markup Language" (YAML不是一种置标语言)的递归缩写 # yaml配置 server: prot: YAML语 ...
- Springboot:JSR303数据校验(五)
@Validated //开启JSR303数据校验注解 校验规则如下: [一]空检查 @Null 验证对象是否为null @NotNull 验证对象是否不为null, 无法查检长度为0的字符串 @No ...
- springboot配置(yami配置文件,JSR303数据校验,多环境配置)
yami配置文件 YAML是 "YAML Ain't a Markup Language" (YAML不是一种标记语言)的递归缩写.在开发的这种语言时,YAML 的意思其实是:&q ...
- SpringMVC框架07——服务器端JSR303数据校验
1.数据校验概述 数据校验分为客户端校验和服务器端校验,客户端主要是通过过滤正常用户的误操作,是第一道防线,一般使用JavaScript代码实现.但是只有客户端校验是不够的,攻击者可以绕过客户端验证直 ...
- springMVC使用JSR303数据校验
JSR303注解 hibernate validate是jsr 303的一个参考实现,除支持所有的标准校验注解外,他还支持扩展注解 spring4.0拥有自己独立的数据校验框架,同时支持jsr 303 ...
- JSR303数据校验
Springboot中可以用@validated来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理. 导入依赖: <dependency> <groupId>org ...
- SpringBoot 之 JSR303 数据校验
使用示例: @Component @ConfigurationProperties(prefix = "person") @Validated //使用数据校验注解 public ...
- JSR-303 数据校验学习
一.JSR-303简介JSR-303 是 JAVA EE 6 中的一项子规范,叫做 Bean Validation,官方参考实现是Hibernate Validator. 此实现与 Hibernate ...
- Struts 2 数据校验要用到的类和两种校验方式以及一些校验问题的解决
通过继承ActionSupport类来完成Action开发,ActionSupport类不仅对Action接口进行简单实现, 同时增加了验证.本地化等支持 .真实开发中自定义Action都需要继承该类 ...
随机推荐
- [MongoDB] Mongo 表字段添加索引, 查看索引, 删除索引
查看索引: db.getCollection('xx').getIndexes(); 创建索引: # 1 代表升序,-1代表降序,name 指定索引名 db.getCollection('xx').c ...
- 使用 Uno Islands 在现有 WPF 里面嵌入 Uno 框架
随着 2022 9 月份 Uno 发布了 4.5 版本,现有的 WPF 应用多了一个新的开发模式,那就是通过 Uno Islands 技术,在现有的 WPF 应用里面嵌入 Uno 应用.通过此方式可以 ...
- 从零开始写 Docker(十二)---实现 mydocker stop 停止容器
本文为从零开始写 Docker 系列第十二篇,实现类似 docker stop 的功能,使得我们能够停止指定容器. 完整代码见:https://github.com/lixd/mydocker 欢迎 ...
- MSSQL—存储过程分页
SET QUOTED_IDENTIFIER ON SET ANSI_NULLS ON GO CREATE PROCEDURE [dbo].[GetPagingStr] @PRESQL VARCHAR( ...
- js实现懒加载原理
概念:对于页面有很多静态资源的情况下(比如网商购物页面),为了节省用户流量和提高页面性能,可以在用户浏览到当前资源的时候,再对资源进行请求和加载.原理:当图片元素的偏移高度<=设备高度+滚动条与 ...
- 【爬虫案例】用Python爬取抖音热榜数据!
目录 一.爬取目标 二.编写爬虫代码 三.同步讲解视频 3.1 代码演示视频 四.获取完整源码 一.爬取目标 您好,我是@马哥python说,一名10年程序猿. 本次爬取的目标是:抖音热榜 共爬取到5 ...
- docker-compse 安装nginx 配置目录挂载
一.新建一个启动服务的目录 mkdir /usr/local/docker/compose cd /usr/local/docker/compose 二.新建文件docker-compose.yml ...
- Golang 之 casbin(权限管理)
目录 1. 权限管理 官网 编辑器测试 1.1.1. 特征 Casbin的作用 Casbin不执行的操作 1.1.2. 怎么运行的 1.1.3. 安装 1. 示例代码 xormadapter 2. 示 ...
- FTP主动模式和被动模式(2)
防火墙对FTP的影响 ASPF 多通道协议 应用层程序有些使用的是单通道协议,有些使用的是多通道协议. 单通道协议 例如http协议,整个协议交互过程中,服务端和客户端只建立一个连接,并且服务端固定使 ...
- Unity Visual Scripting 使用随记
1.Wait Until并不会再执行前面的代码,而是反复执行获取bool变量的代码:需自己拆出来写. 2.yield return null对应Wait For Next Frame,多用这个避免协程 ...