HibernateValidator学习笔记

前言

版本说明

hibernate-validator=6.1.5.Final

相关链接:

  • HibernateValidator 官网:http://hibernate.org/validator/
  • HibernateValidator 官方文档:http://hibernate.org/validator/documentation/getting-started/
  • HibernateValidator maven 地址:https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator

常用注解

注解中有个共同的属性 message,可以自定义错误信息

注解 说明
@NotNull 值不能为空
@Null 值必须为空
@Pattern(regex=) 字符串必须匹配正则表达式
@Size(min=, max=) 集合元素的数量必须在min和max之间
@Email 字符串必须是Email地址
@Length(min=,max=) 检查字符串的长度
@NotBlank 检查字符串不为null,并且长度大于0。
@Range(min=,max=) 数字必须大于等于min,小于等于max
@SafeHtml 字符串是安全的html
@URL 字符串是合法的URL
@AssertFalse 值必须是false;支持的数据类型:Booleanboolean
@AssertTrue 值必须是true;支持的数据类型:Booleanboolean
@DecimalMax(value=, inclusive=) 值必须小于等于(inclusive=true)/小于(inclusive=false) value 属性指定的值;
支持的数据类型:BigDecimalBigIntegerCharSequencebyteshortintlong和原始类型的相应的包装;
@DecimalMin(value=, inclusive=) 值必须大于等于(inclusive=true)/大于(inclusive=false) value 属性指定的值;
支持的数据类型:BigDecimalBigIntegerCharSequencebyteshortintlong和原始类型的相应的包装;
@Digits(integer=, fraction=) 数字格式检查,integer指定整数部分的最大长度,fraction指定小数部分的最大长度
支持的数据类型:``BigDecimalBigIntegerCharSequencebyteshortintlong`和原始类型的相应的包装;
@Future 值必须是未来的日期
@FutureOrPresent 检查日期是现在还是将来
@Past 值必须是过去的日期
@PastOrPresent 检查带注释的日期是过去还是现在
@Max(value=) 值必须小于等于value指定的值。
@Min(value=) 值必须大于等于value指定的值
@Negative 检查元素是否严格为负。零值被视为无效。
支持的数据类型:BigDecimalBigIntegerbyteshortintlong和原始类型的相应的包装
@NegativeOrZero 检查元素是负数或者零。
@Positive 检查元素是否严格为正。零值被视为无效。
@PositiveOrZero 检查元素是正数还是零。

核心pom依赖

<!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
<dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId><version>6.1.5.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.glassfish/jakarta.el -->
<dependency><groupId>org.glassfish</groupId><artifactId>jakarta.el</artifactId><version>3.0.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.el/javax.el-api -->
<dependency><groupId>javax.el</groupId><artifactId>javax.el-api</artifactId><version>3.0.0</version>
</dependency>

校验 SpringMVC 入参校验

  1. 在实体类字段添加校验注解
  2. 在controller层添加@Valid 注解使之生效
package top.simba1949.controller;import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import top.simba1949.common.Person;import javax.validation.Valid;/*** @Author Theodore* @Date 2019/12/2 17:50*/
@Slf4j
@RestController
@RequestMapping("person")
public class PersonController {/*** 添加注解 @Valid,才能使实体类Person的校验注解生效* @param person* @return*/@PostMappingpublic String insert(@Valid @RequestBody Person person){log.debug("person is {}", person);return "SUCCESS";}
}

校验非 SpringMVC 入参校验

pom.xml 依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>top.simba1949</groupId><artifactId>hibernate-validator-learn</artifactId><version>1.0-SNAPSHOT</version><dependencies><!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator --><dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId><version>6.1.5.Final</version></dependency><!-- https://mvnrepository.com/artifact/org.glassfish/jakarta.el --><dependency><groupId>org.glassfish</groupId><artifactId>jakarta.el</artifactId><version>3.0.3</version></dependency><!-- https://mvnrepository.com/artifact/javax.el/javax.el-api --><dependency><groupId>javax.el</groupId><artifactId>javax.el-api</artifactId><version>3.0.0</version></dependency><!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.12</version><scope>provided</scope></dependency><!-- https://mvnrepository.com/artifact/com.google.guava/guava --><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>29.0-jre</version></dependency></dependencies><build><plugins><!--https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-compiler-plugin--><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin></plugins></build>
</project>

参数校验

User.java

package top.simba1949.model;import lombok.Data;import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;/*** @author Anthony* @date 2020/9/15 20:04*/
@Data
public class User {@NotNull(message = "id不能为空")private Integer id;@Size(min = 2, max = 8, message = "用户名必须在2~8个字符区间内")@NotNull(message = "用户名必须不能为空")private String username;
}

参数校验测试

package top.simba1949;import top.simba1949.model.User;import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.util.Set;/*** @author Anthony* @date 2020/9/15 19:22*/
public class Application {public static void main(String[] args) {User user = new User();user.setId(1);user.setUsername("123456789");// Validator从中检索对象ValidatorFactory。// 一个Validator 实例是线程安全的,可重复使用多次。// 因此,它可以安全地存储在静态字段中,并在测试方法中用于验证不同的实例。ValidatorFactory factory = Validation.buildDefaultValidatorFactory();Validator validator = factory.getValidator();Set<ConstraintViolation<User>> violationSet = validator.validate(user);if (!violationSet.isEmpty()){throw new RuntimeException(violationSet.iterator().next().getMessage());}}
}

分组校验

定义分组接口

package top.simba1949.model;/*** @author Anthony* @date 2020/9/15 22:41*/
public interface RoleInsert {}
package top.simba1949.model;/*** @author Anthony* @date 2020/9/15 22:41*/
public interface RoleUpdate {}

Role

package top.simba1949.model;import lombok.Data;import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;/*** @author Anthony* @date 2020/9/15 22:34*/
@Data
public class Role {/***  groups 定义分组*/@NotNull(message = "id不能为空", groups = {RoleUpdate.class})private Integer id;@NotNull(message = "roleName不能为空", groups = {RoleInsert.class, RoleUpdate.class})private String roleName;@NotNull(message = "gmtCreate不能为空", groups = {RoleInsert.class})private LocalDateTime gmtCreate;@NotNull(message = "gmtModify不能为空", groups = {RoleUpdate.class})private LocalDateTime gmtModify;
}

参数校验测试

package top.simba1949;import top.simba1949.model.*;import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.time.LocalDateTime;
import java.util.Set;/*** @author Anthony* @date 2020/9/15 19:22*/
public class Application {public static void main(String[] args) {Role role = new Role();role.setId(1);role.setGmtModify(LocalDateTime.now());ValidatorFactory factory = Validation.buildDefaultValidatorFactory();Validator validator = factory.getValidator();// 分组校验Set<ConstraintViolation<Role>> violationSet = validator.validate(role, RoleUpdate.class);if (!violationSet.isEmpty()){throw new RuntimeException(violationSet.iterator().next().getMessage());}}
}

自定义约束校验

要创建自定义约束,需要执行以下三个步骤:

  1. 自定义注解并指定校验逻辑类
  2. 自定义校验逻辑类,实现 ConstraintValidator<A extends Annotation, T> 接口,填写具体的校验逻辑
  3. HibernateValidator 原生注解一样使用即可

自定义注解并指定校验逻辑类

package top.simba1949;import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** @author Anthony* @date 2020/9/15 22:54*/
@Target(value = {ElementType.FIELD, ElementType.METHOD})
@Retention(value = RetentionPolicy.RUNTIME)
@Constraint(validatedBy = EmailConstraintValidator.class)
public @interface EmailValidation {// message()、groups()、payload() 必须存在String message() default "";Class<?>[] groups() default { };Class<? extends Payload>[] payload() default { };
}

自定义校验逻辑类

package top.simba1949;import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;/*** @author Anthony* @date 2020/9/15 22:55*/
public class EmailConstraintValidator implements ConstraintValidator<EmailValidation, String> {/*** 初始化* @param constraintAnnotation*/@Overridepublic void initialize(EmailValidation constraintAnnotation) {System.out.println("init");}@Overridepublic boolean isValid(String value, ConstraintValidatorContext context) {if (null == value || value.length() == 0){return false;}final String emailFormat = "\\w[-\\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\\.)+[A-Za-z]{2,14}";return value.matches(emailFormat);}
}

参数校验测试

package top.simba1949;import top.simba1949.model.User;import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import java.util.Set;/*** @author Anthony* @date 2020/9/15 19:22*/
public class Application {public static void main(String[] args) {User user = new User();user.setId(1);user.setUsername("username");Set<ConstraintViolation<User>> violationSet = Validation.buildDefaultValidatorFactory().getValidator().validate(user);if (!violationSet.isEmpty()){throw new RuntimeException(violationSet.iterator().next().getMessage());}}
}

HibernateValidator学习笔记相关推荐

  1. Dubbo -- 系统学习 笔记 -- 示例 -- 参数验证

    Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 参数验证 参数验证功能是基于JSR303实现的,用户只需标识JSR303标准的验证 ...

  2. SpringMVC框架--学习笔记(上)

    1.SpringMVC入门程序: (1)导入jar包:spring核心jar包.spring-webmvc整合Jar包 (2)配置前端控制器:web.xml文件中 <?xml version=& ...

  3. SpringMVC学习笔记

    文章目录 SpringMVC学习笔记 Spring MVC 什么是 MVC 设计模式? Spring MVC 的核心组件 Spring MVC 的工作流程 如何使用? Spring MVC 注解 Sp ...

  4. 8. SpringBoot基础学习笔记

    SpringBoot基础学习笔记 课程前置知识说明 1 SpringBoot基础篇 1.1 快速上手SpringBoot SpringBoot入门程序制作 1.2 SpringBoot简介 1.2.1 ...

  5. PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call

    您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...

  6. 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  7. 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  8. 2020年Yann Lecun深度学习笔记(下)

    2020年Yann Lecun深度学习笔记(下)

  9. 2020年Yann Lecun深度学习笔记(上)

    2020年Yann Lecun深度学习笔记(上)

  10. 知识图谱学习笔记(1)

    知识图谱学习笔记第一部分,包含RDF介绍,以及Jena RDF API使用 知识图谱的基石:RDF RDF(Resource Description Framework),即资源描述框架,其本质是一个 ...

最新文章

  1. python多线程下的信号处理程序示例
  2. Eclipse搭建java分布式商城项目
  3. java_jdbc_spring框架查询操作简例
  4. 一封电子邮件的发送和接收的主要步骤
  5. springmvc restful风格操作
  6. 文件编码和RandomAccessFile文件流的使用--IO学习笔记(一)
  7. 联通培训 老师教的 bootstrap row 里面都是12行不断的分割成小格子
  8. matlab 获取系统时间now,date
  9. 【学神】1-4 用户及用户组管理
  10. sql怎样删除重复值
  11. html 文字过多如何显示,当页面文字过多时,怎么用css使超出部分显示省略号?(单/多行代码演示)...
  12. java通道 硬件通道 如何联系_Java NIO5:通道和文件通道
  13. 奇怪的Adobe dynamic link
  14. 【资料】《模拟电子技术基础-童诗白第四版》
  15. 计算机怎么取消用户密码,怎么取消电脑开机密码界面
  16. 未知USB设备(设备描述符请求失败)解决方法
  17. JavaEE中的依赖性——依赖性注入
  18. Torch 论文复现:卷积注意力模块 CBAM
  19. python selenium 的使用——alibaba询盘
  20. 十一章——Trangle类

热门文章

  1. 软件设计中的心跳机制
  2. oracle科学计数法问题,ORACLE中科学计数法显示问题的解决
  3. Unity Shader 标准光照模型——漫反射
  4. Revel框架的搭建与部署教程
  5. angular 架构
  6. 1ke android逆向助手_android逆向助手
  7. 关于 sys.argv 的详解,看完这篇你要是还不明白 我倒立吃翔 稀得
  8. 【推荐系统->统计学】辛普森悖论(Simpson‘s paradox)
  9. protocol buffer 使用
  10. 大数据时代下的SQL Server第三方负载均衡方案 ----Moebius测试