前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >你有没有使用过这些编程骚操作(二)- 验证框架(Part A)

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

作者头像
RiemannHypothesis
发布2022-08-19 17:01:45
6220
发布2022-08-19 17:01:45
举报
文章被收录于专栏:Elixir

一、验证框架

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

验证模型

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

image.png
image.png

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

image.png
image.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
image.png

引入validation相关依赖

代码语言:javascript
复制
<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实体类,先不定义任何属性,待到需要验证时再定义属性

代码语言:javascript
复制
@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

代码语言:javascript
复制
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
image.png

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

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

image.png
image.png

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

@NotEmpty、@NotBlank

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

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

image.png
image.png

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

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

image.png
image.png

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

image.png
image.png

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

@Length

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

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

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

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

image.png
image.png

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

image.png
image.png

@Email

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

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

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

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

代码语言:javascript
复制
user.setEmail("213243@stark.com");
image.png
image.png

@Min、@Max

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

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

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

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

代码语言:javascript
复制
user.setAge(9);

执行测试

image.png
image.png

修改设置的年龄大小

代码语言:javascript
复制
user.setAge(119);
image.png
image.png

@Past

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

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

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

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

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

执行测试

image.png
image.png

@Size

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

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

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

在init方法中设置firends属性

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

执行测试

image.png
image.png

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-02-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、验证框架
    • 验证模型
      • Bean Validation
        • JCP与JSR
          • Bean Validation 与 Hibernate Validator
            • Hibernate Validator VS Spring Validation
              • 常用约束注解
              • 二、工程搭建
              • 三、初级约束注解的使用
                • @NotNull
                  • @NotEmpty、@NotBlank
                    • @Length
                      • @Email
                        • @Min、@Max
                          • @Past
                            • @Size
                            领券
                            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档