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都需要继承该类 ...
随机推荐
- 智能数据构建与管理平台Dataphin的前世今生:缘起
简介: 阿里巴巴提出的OneData方法论帮助企业捋清了数据全生命周期的管理思路,更将其植入到产品Dataphin(智能数据构建与管理)中,通过阿里云为企业提供服务. Dataphin 智能数据构建与 ...
- 龙蜥社区成立系统运维SIG,重磅开源sysAK系统运维工具集
简介:系统运维SIG致力于打造一个集主机管理.配置部署.监控报警.异常诊断.安全审计等一系列功能的自动化运维平台. OpenAnolis 龙蜥社区(以下简称"龙蜥社区")正式成 ...
- 块存储监控与服务压测调优利器-EBS Lens发布
简介:SLS团队联合EBS团队发布了EBS Lens,针对块存储提供数据分析.资源监控的功能,可以帮助用户获取云上块存储资源信息与性能监控数据.提升云上块存储资源的管理效率.高效分析业务波动与资源性 ...
- 深入解析 Dubbo 3.0 服务端暴露全流程
简介: 随着云原生时代的到来,Dubbo 3.0 的一个很重要的目标就是全面拥抱云原生.正因如此,Dubbo 3.0 为了能够更好的适配云原生,将原来的接口级服务发现机制演进为应用级服务发现机制. ...
- [GPT] nodejs 什么情况下可以使用 import 来引入 export 的模块
在 Node.js 中,原生并不支持 ES6 的 import 语句来引入模块. 不过从 Node.js v12 开始,通过实验性功能(--experimental-modules)可以使用 .mjs ...
- dotnet DirectX 通过 Vortice 控制台使用 ID2D1DeviceContext 绘制画面
在上一篇博客里面告诉大家,如何使用 Vortice 从零开始控制台创建 Direct2D1 窗口.上一篇博客采用的是 CreateDxgiSurfaceRenderTarget 的方式拿到了 ID2D ...
- 2019-10-18-C#-判断系统版本
title author date CreateTime categories C# 判断系统版本 lindexi 2019-10-18 15:2:0 +0800 2018-03-08 17:34:3 ...
- 读取 k8s 存储在 etcd 上的数据
读取 k8s 存储在 etcd 上的数据 Etcd Assistant 是一款 Etcd 可视化管理工具,便捷高效地操作您的 etcd 集群:支持多种键的视图:管理租约.用户.角色和权限. etcd是 ...
- Ubuntu环境下docker每次都需要sudo的问题
1.添加 docker 用户组 sudo groupadd docker 可以通过 cat /etc/group 指令查看存在的用户组 2.将当前用户添加到 docker 组中 sudo gpassw ...
- 还在用Jenkins?快来试试这款比Jenkins简而轻的自动部署软件!
大家好,我是 Java陈序员. 在工作中,你是否遇到过团队中没有专业的运维,开发还要做运维的活,需要自己手动构建.部署项目? 不同的项目还有不同的部署命令,需要使用 SSH 工具连接远程服务器和使用 ...