【如何优雅的参数校验:hibernatevalidator 校验框架集成SpringMvc

2023年 9月 23日 71.7k 0

hibernate-validator校验框架

一、传统的参数校验

public class TraditionalTest {


    @Test
    public void test01(){
        UserInfo userInfo = new UserInfo();
        validateUserInfo(userInfo);
    }

    private static void validateUserInfo(UserInfo userInfo){
        // 用户名校验
        String name = userInfo.getName();
        if (name == null || "".equals(name) || "".equals(name.trim())) {
            //不符合校验规则
            throw new RuntimeException("name 不符合校验规则");
        }

        // age校验
        Integer age = userInfo.getAge();
        boolean ageValidate = age > 1 && age < 200;
        if (!ageValidate) {
            throw new RuntimeException("age不符合校验规则,应在(1-200)");
        }

        //......
    }

}

二、非web环境下使用hibernate-validator

2.1 搭建环境

        
        
            org.hibernate.validator
            hibernate-validator
            7.0.1.Final
        
        
        
            org.apache.tomcat.embed
            tomcat-embed-el
            10.0.22
        

2.2 validator初体验

  • 编写 ValidationUtil 工具类

    package com.zs.validation;
    
    import jakarta.validation.ConstraintViolation;
    import jakarta.validation.Validation;
    import jakarta.validation.Validator;
    
    import java.util.List;
    import java.util.Set;
    import java.util.stream.Collectors;
    
    public class ValidationUtil {
    
        private static Validator validator;
    
        static {
            validator = Validation.buildDefaultValidatorFactory().getValidator();
        }
    
        public static List  valid(Object obj) {
            //如果被校验对象 没有校验通过,则set里面就有校验信息
            Set set = validator.validate(obj);
            List list = set.stream().map(v -> "属性:" + v.getPropertyPath() + ",属性的值" +
                    v.getInvalidValue() + ",校验不通过的提示信息:" + v.getMessage())
                    .collect(Collectors.toList());
            return list;
        }
    }
    
  • 给需要校验的类添加注解

    import jakarta.validation.constraints.NotNull;
    
    @Data
    public class UserInfo {
        /**
         * 不能是null, "", "   "
         */
        @NotNull
        private String name;
    
  • 测试验证

    public class Demo {
    
        public static void main(String[] args) {
           
            UserInfo userInfo =new UserInfo() ;
    
            List list = ValidationUtil.valid(userInfo);
            System.out.println(list);
    
        }
    }
    
    

2.3 validator加载原理

2.3.1 javaEE规范

  • javaEE规范是很多不相关的java package组成的javaee规范
  • 常见的javaEE规范
    • javax.sql ---- mysql ,sqlserver,oracle …
    • javax.jms ---- activemq
    • javax.servlet ---- tomcat,jetty …
    • javax.persistence ---- hibernate
    • javax.transaction----分布式事务
    • java.validation ----- hibernate-validator

​ jdk自带了一些常用的javaee规范,对于没有自带的如果想要使用就需要自己引用了,比如beanvalidation

2.3.2 SPI机制

  • ​ spi全称为 (Service Provider Interface),是JDK内置的一种服务提供发现机制。SPI是一种动态替换发现的 机制,一种解耦非常优秀的思想。
  • spi的工作原理: 就是ClassPath路径下的META-INF/services文件夹中, 以接口的全限定名来命名文件名,文件里面写该接口的实现。然后再资源加载的方式,读取文件的内容(接口实现的全限定名), 然后再去加载类。
  • spi可以很灵活的让接口和实现分离, 让api提供者只提供接口, 第三方来实现。

2.3.3 源码解析

49d277848567cec970282e61bac4d759.jpeg

3cc92dc6a0d135def5c8c377926ffaa0.jpeg

d70d4516ca819b76c9d711545743cfef.jpeg

2.4 常用的校验约束注解

@Null			//被注释的元素必须为null
@NotNull //被注释的元素必须不为null
@NotEmpty //被注释的集合(size > 0)/字符串(!=null && !"")
@NotBlank //!=null && !"" && !" "
@AssertTrue //被注释的元素必须为true
@AssertFalse //被注释的元素必须为false
@Min(value) //被注释的元素必须是一个数字,>=
@Max(value) //被注释的元素必须是一个数字,=
@DecimalMax(value)

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论