你有没有使用过这些编程骚操作(二)- 验证框架(Part A)

简介: 你有没有使用过这些编程骚操作(二)- 验证框架(Part A)

一、验证框架

验证框架对用来对数据进行校验的一个框架,本篇将演示如何通过使用已有的约束注解及如何自定义约束注解进行数据校验,并了解JSR规范、验证框架的原理

验证模型

第一种是分层验证即在MVC架构中的每一层进行校验,这样就会造成大量的重复代码

6e2aff7c8db04f79937ada4acb9d4342_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

第二种是Java Bean验证即只将验证逻辑通过注解约束在域模型上,将验证逻辑从业务代码中分离出来

4702157253a545c4a883234c968d58fd_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

Bean Validation

Bean Validation是为了Java Bean验证定义的响应的元数据模型和API

JCP与JSR

JCP(Java Community Process)成立于1998年,是使有兴趣的各方参与定义Java Bean的特征和未来版的正式过程

JCP使用JSR(Java规范请求,Java Specification Requests)作为正式规范文档,描述被提议加入到Java体系中的规范和技术

  • JSR303即Bean Validation 1.0
  • JSR349即Bean Validation 1.1
  • JSR380即Bean Validation 2.0

Bean Validation 与 Hibernate Validator

  • Bean Validation 1.0参考实现:Hibernate Validator 4.3.1 Final
  • Bean Validation 1.1参考实现:Hibernate Validator 5.1.1 Final
  • Bean Validation 2.0参考实现:Hibernate Validator 6.0.1 Final

plus:Hibernate Validator与ORM框架Hibernate没有任何关系

Hibernate Validator VS Spring Validation

Spring Validation在Hibernate Validator的基础上对其进行了二次封装,实现在Spring环境中更简单、更高效的对数据进行验证

常用约束注解

  • 空值校验类:@Null、@NotNull、@NotEmpty、@NotBlank
  • 范围校验类:@Min、@Size、@Digits、@Future、@Negative
  • 其他校验类:@Email、@URL、@AssertTure、@Pattern plus:@NotEmpty会将左右空字符去除后判断,@NotBlank直接判断

二、工程搭建

新建maven项目,选择maven-archetype-quickstart

image.png

引入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>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.18</version>
    <scope>provided</scope>
</dependency>
复制代码

新增entity包,并在entity包下新增User实体类,先不定义任何属性,待到需要验证时再定义属性

@Data
public class User {
    private Integer userId;
    private String userName;
    private String passWord;
    private String email;
    private String phone;
    private Integer age;
    private Date birthday;
    private List<User> friends;
}
复制代码

三、初级约束注解的使用

  • 空值验证
  • 范围验证
  • 其他验证

@NotNull

在User实体类的userId属性上增加注解@NotNull(message="用户ID不能为空"),message为验证信息,当不符合条件时会返回message信息

在test包下生成User测试类UserTest

public class UserTest {
    // 验证器对象
    private Validator validator;
    // 待验证对象
    private User user;
    private Set<ConstraintViolation<User>> set;
    // 初始化
    @Before
    public void init(){
        // 初始化验证器
        validator = Validation.buildDefaultValidatorFactory().getValidator();
        user = new User();
    }
    @Test
    public void testUser(){
        set = validator.validate(User);
    }
    // 打印结果
    @After
    public void after(){
        set.forEach(item -> {
            // 输出错误信息
            System.out.println(item.getMessage());
        });
    }
}
复制代码

首先在init方法中new一个User对象,先不对属性进行赋值,执行测试

image.png

validator调用validate方法会返回一个set集合,如果验证失败则会将错误信息放在set集合中, User对象的ID为空,验证失败,集合中保存了message信息,所以控制台输出@NotNull注解中指定的错误信息,@NotNull注解生效

在init方法中调用User的setter方法给id属性进行赋值,再次执行测试

image.png

验证成功,验证结果集为空,所以输出内容为空

@NotEmpty、@NotBlank

@NotEmpty和@NotBlank都可以验证内容是否为空。

在User实体类的userName和password属性上分别增加 @NotEmpty(message = "用户的userName不能为空") 和@NotBlank(message = "用户的password不能为空")两个注解,执行测试testUser测试方法

image.png

验证失败,控制台输出注解中定义的message的信息

在init方法中新增对User对象的userName属性调用setter方法进行赋值,再次执行测试

image.png

init方法中设置userName和password都为" ",再次执行测试

image.png

@NotBlank会自动去掉字符串中的空格后再进行验证

@Length

可用于验证字符串的长度,有min和max及message三个属性

在用户的password属性上增加@Length注解,设置min、max、message三个属性的value

@Length(min = 6, max = 20, message = "用户密码不能少于6位,不能多于20位")
复制代码

在init方法中调用setter方法设置用户密码少于6位,执行测试

image.png

在init方法中调用setter方法设置用户密码多于20位,再次执行测试

image.png

@Email

@Email只能验证邮箱格式是否正确,@NotNull用于验证是否为空

在User实体类的email属性上增加@Email注解

@Email(message = "用户邮箱格式不正确")
复制代码

在init方法中调用setter方法对Email进行赋值,执行测试

user.setEmail("213243@stark.com");
复制代码

网络异常,图片无法展示
|

@Min、@Max

@Min和@Max可用于整形数据的范围验证

在User实体类的age属性上增加@Min和@Max两个注解,设定用户的年龄范围

@Min(value = 18, message = "用户年龄不能小于18岁")
@Max(value = 100, message = "用户年龄不能大于100岁")
复制代码

在init方法中调用setter方法设置用户年龄

user.setAge(9);
复制代码

执行测试

image.png

修改设置的年龄大小

user.setAge(119);
复制代码

image.png

@Past

@Past可以对时间完成校验,校验给出的时间是否是过去的时间

在User实体类的birtdday属性上增加@Past注解

@Past(message = "用户生日不能为未来的时间点")
复制代码

在init方法设置用户的birthday属性

Calendar calendar = Calendar.getInstance();
calendar.set(2023,1,1);
user.setBirthday(calendar.getTime());
复制代码

执行测试

image.png

@Size

@Size可以对集合中的元素的个数进行校验,同样有min、max、message三个属性

在User实体类的friends属性上增加@Size注解

@Size(min = 1, message = "用户好友不能少于1个")
复制代码

在init方法中设置firends属性

List<User> friends = new ArrayList<>();
user.setFriends(friends);
复制代码

执行测试

image.png

以上就是初级约束注解的使用方式



相关文章
|
7月前
|
SQL 分布式计算 Java
Spark学习---SparkSQL(概述、编程、数据的加载和保存、自定义UDFA、项目实战)
Spark学习---SparkSQL(概述、编程、数据的加载和保存、自定义UDFA、项目实战)
402 1
|
SQL 缓存 分布式计算
Spark学习---5、SparkSQL(概述、编程、数据的加载和保存)(一)
Spark学习---5、SparkSQL(概述、编程、数据的加载和保存)(一)
|
SQL 存储 JSON
Spark学习---5、SparkSQL(概述、编程、数据的加载和保存)(二)
Spark学习---5、SparkSQL(概述、编程、数据的加载和保存)(二)
|
jenkins 持续交付 Python
python接口自动化(十五)--参数关联接口(详解)
我们用自动化新建任务之后,要想接着对这个新建任务操作,那就需要用参数关联了,新建任务之后会有一个任务的Jenkins-Crumb,获取到这个Jenkins-Crumb,就可以通过传这个任务Jenkins-Crumb继续操作这个新建的任务。
470 0
python接口自动化(十五)--参数关联接口(详解)
|
前端开发 Java Spring
你有没有使用过这些编程骚操作(二)- 验证框架(Part C)
你有没有使用过这些编程骚操作(二)- 验证框架(Part C)
你有没有使用过这些编程骚操作(二)- 验证框架(Part C)
你有没有使用过这些编程骚操作(二)- 验证框架(Part B)
你有没有使用过这些编程骚操作(二)- 验证框架(Part B)
你有没有使用过这些编程骚操作(二)- 验证框架(Part B)
你有没有使用过这些编程骚操作(一)- Lombok(Part B)(下)
你有没有使用过这些编程骚操作(一)- Lombok(Part B)
你有没有使用过这些编程骚操作(一)- Lombok(Part B)(下)
|
IDE 开发工具
你有没有使用过这些编程骚操作(一)- Lombok(Part A)(下)
你有没有使用过这些编程骚操作(一)- Lombok(Part A)
你有没有使用过这些编程骚操作(一)- Lombok(Part A)(下)
|
Java 编译器 Go
你有没有使用过这些编程骚操作(一)- Lombok(Part A)(上)
你有没有使用过这些编程骚操作(一)- Lombok(Part A)
你有没有使用过这些编程骚操作(一)- Lombok(Part A)(上)
|
Java Maven
你有没有使用过这些编程骚操作(一)- Lombok(Part B)(上)
你有没有使用过这些编程骚操作(一)- Lombok(Part B)
你有没有使用过这些编程骚操作(一)- Lombok(Part B)(上)