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 必须符合该正则表达式
@Email 必须是电子邮箱格式

范围类型校验

注解 作用
@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数据校验使用方法记录的更多相关文章

  1. [SpringBoot] - 配置文件的多种形式及JSR303数据校验

    Springboot配置文件: application.yml   application.properties(自带) yml的格式写起来稍微舒服一点 在application.properties ...

  2. YAML语法使用,JSR303数据校验

    YAML YAML是 "YAML Ain't a Markup Language" (YAML不是一种置标语言)的递归缩写 # yaml配置 server: prot: YAML语 ...

  3. Springboot:JSR303数据校验(五)

    @Validated //开启JSR303数据校验注解 校验规则如下: [一]空检查 @Null 验证对象是否为null @NotNull 验证对象是否不为null, 无法查检长度为0的字符串 @No ...

  4. springboot配置(yami配置文件,JSR303数据校验,多环境配置)

    yami配置文件 YAML是 "YAML Ain't a Markup Language" (YAML不是一种标记语言)的递归缩写.在开发的这种语言时,YAML 的意思其实是:&q ...

  5. SpringMVC框架07——服务器端JSR303数据校验

    1.数据校验概述 数据校验分为客户端校验和服务器端校验,客户端主要是通过过滤正常用户的误操作,是第一道防线,一般使用JavaScript代码实现.但是只有客户端校验是不够的,攻击者可以绕过客户端验证直 ...

  6. springMVC使用JSR303数据校验

    JSR303注解 hibernate validate是jsr 303的一个参考实现,除支持所有的标准校验注解外,他还支持扩展注解 spring4.0拥有自己独立的数据校验框架,同时支持jsr 303 ...

  7. JSR303数据校验

    Springboot中可以用@validated来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理. 导入依赖: <dependency> <groupId>org ...

  8. SpringBoot 之 JSR303 数据校验

    使用示例: @Component @ConfigurationProperties(prefix = "person") @Validated //使用数据校验注解 public ...

  9. JSR-303 数据校验学习

    一.JSR-303简介JSR-303 是 JAVA EE 6 中的一项子规范,叫做 Bean Validation,官方参考实现是Hibernate Validator. 此实现与 Hibernate ...

  10. Struts 2 数据校验要用到的类和两种校验方式以及一些校验问题的解决

    通过继承ActionSupport类来完成Action开发,ActionSupport类不仅对Action接口进行简单实现, 同时增加了验证.本地化等支持 .真实开发中自定义Action都需要继承该类 ...

随机推荐

  1. Region-区域(默认和新增)适配器

    Prism内置了几个区域适配器 ContentControlRegionAdapter ItemsControlRegionAdapter SelectorRegionAdapter ComboBox ...

  2. WPF 如何在静态资源定义字体大小

    默认的 WPF 的字体大小的单位是像素,如果想要将字体大小使用 pt 点表示,写在 xaml 里面是直接添加 pt 后缀.但是此时如果在静态资源尝试定义的时候写上了 pt 将会在运行的时候提示无法转换 ...

  3. docker-compose部署EFK

    参考 docker_compose_efk elasticsearch.kibana.filebeat https://github.com/haimait/docker_compose_efk do ...

  4. Consul启动闪退

    一.问题概述 在Windows10下载了consul,解压完后,点击consul.exe出现闪退,其实闪退也不影响使用 二.解决方案 方案1: 按理说第一种方法就可以解决问题:在环境变量的系统变量中的 ...

  5. installshield 64位系统操作注册表遇到的问题

    最近在研究IS脚本设置jdk环境变量问题,在使用RegDBKeyExist判断注册表中项的时候一直找不到,翻找文档后发现64位的操作系统需要设置 REGDB_OPTIONS. "SOFTWA ...

  6. Splashtop 扩展了所有 Android 8.0 以上设备的远程控制功能

    好消息:Splashtop远程访问和远程支持软件现在支持100多个品牌的 Android 设备. 2020年9月15日,远程访问和远程支持解决方案的全球领导者 Splashtop Inc. 宣布:所有 ...

  7. 密码学—Vigenere加密Python程序

    文章目录 维吉尼亚加密 加密算法 解密算法 注意事项 维吉尼亚加密 古典密码,属于多表加密. 怎么就是多表了? 维吉尼亚密码的加密算法实质是凯撒密码,因为他是先分好小组,然后用密钥串对应着分好组的每一 ...

  8. C4996 scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details

    编译器报错,编译器使用的是Visual Studio2019版本 修改项目属性的检测sdl. 第一步,右键项目--->属性 *第二步,在打开的属性中选择,配置属性-->C/C++---&g ...

  9. PHP做api开发时,签名验证你是怎么设计的

    开发过程中,我们经常会与接口打交道,有的时候是调取别人网站的接口,有的时候是为他人提供自己网站的接口,但是在这调取的过程中都离不开签名验证. 我们在设计签名验证的时候,请注意要满足以下几点: 可变性: ...

  10. 鸿蒙极速入门(二)-开发准备和HelloWorld

    一.开发准备 本篇博客基于的系统版本:华为官方HarmonyOS版本3.1.OpenHarmony版本4.0Beta 开发语言 ArkTS语言(推荐) JS语言(支持) Java语言(已放弃支持) 从 ...