您现在的位置是:首页 > 后台技术 > JavaJava

代码简洁之道-validation

第十三双眼睛2023-08-30【Java】人已围观

简介代码简洁之道-validation

代码简洁之道-validation
beanvalidation官网:https://beanvalidation.org/   它是接口
hibernatevalidater官网:https://hibernate.org/validator/   它是最佳实现

使用方法:
1:引入依赖
<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.20.Final</version>
</dependency>
<!-- tomcat 对el的支持 用于解析message里面的表达式 -->
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-el</artifactId>
    <version>9.0.29</version>
</dependency>
2:定义一个用来校验的类
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
public class User {

    @NotNull(message = "id不能为空")
    private Long id;
    private String name;
}
3:定义一个校验工具类
package com.xingchen;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
public class ValidationUtil {
    private static Validator validator = null;
    static {
        validator = Validation.buildDefaultValidatorFactory().getValidator();
    }
    public static List<String> valid(User user) {
        // 如果没有校验通过,则 集合有校验信息
        Set<ConstraintViolation<User>> validateSet = validator.validate(user);
        List<String> collect = validateSet.stream().map(o -> o.getMessage())
                .collect(Collectors.toList());
        return collect;
    }
}
编写一个主方法
package com.xingchen;
import java.util.List;
public class App {
    public static void main(String[] args) {
        User user = new User();
        List<String> stringList = ValidationUtil.valid(user);
        System.out.println(stringList);
    }
}
运行程序,可以看到控制台打印出了提示,id不能为null

常用的注解:
@NotNull:要求属性不能为null
@Null:要求属性必须为null
@NotBlank:要求属性不能为空白字符串
@NotEmpty:要求集合的长度不能为0
@Min:最小值 不校验null
@Max:最大值 不校验null
@Pattern(regexp = ""):属性要满足指定的正则表达式

级联校验:当一个类里面有一个属性也是一个类,这个类也需要被校验,这个时候可以加@Valid注解,就可以进行级联校验了
当同一个类的同一个参数在不同的接口,有的接口种可以为null,但是有的接口不能为null,此时就需要指定groups属性,建一个内部类即可。

快速失败:当对象种有多个属性会校验不通过时,没有必要全部校验一遍,校验道第一个不通过时,直接返回就行,这就是快速失败。这时候就不能用默认的校验器了,
需要进行配置。
package com.xingchen;
import org.hibernate.validator.HibernateValidator;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
public class ValidationUtil {
    private static Validator fastFailValidator = null;
    static {
        fastFailValidator = Validation.byProvider(HibernateValidator.class)
                .configure().failFast(true).buildValidatorFactory().getValidator();
    }
    public static List<String> valid(User user) {
        // 如果没有校验通过,则 集合有校验信息
        Set<ConstraintViolation<User>> validateSet = fastFailValidator.validate(user);
        List<String> collect = validateSet.stream().map(o -> o.getMessage())
                .collect(Collectors.toList());
        return collect;
    }
}
运行程序,可以看到结果就只有一个校验结果,不会把所有的属性都校验一遍了。

非bean入参校验
package com.xingchen;
import org.hibernate.validator.HibernateValidator;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.executable.ExecutableValidator;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
public class ValidationUtil {
    private static Validator validator = null;
    private static Validator fastFailValidator = null;
    private static ExecutableValidator executableValidator = null;
    static {
        validator = Validation.buildDefaultValidatorFactory().getValidator();
        fastFailValidator = Validation.byProvider(HibernateValidator.class)
                .configure().failFast(true).buildValidatorFactory().getValidator();
        executableValidator = validator.forExecutables();
    }
    public static List<String> valid(User user) {
        // 如果没有校验通过,则 集合有校验信息
        Set<ConstraintViolation<User>> validateSet = fastFailValidator.validate(user);
        List<String> collect = validateSet.stream().map(o -> o.getMessage())
                .collect(Collectors.toList());
        return collect;
    }
    public static <T> List<String> validNotBean(T object, Method method, Object[] parameterValues, Class<?>... groups) {
        Set<ConstraintViolation<T>> set = executableValidator.validateParameters(object, method, parameterValues, groups);
        List<String> collect = set.stream().map(o -> o.getMessage())
                .collect(Collectors.toList());
        return collect;
    }
}
调用validNotBean方法即可校验。


 

Tags:

很赞哦! ()

文章评论

    共有条评论来说两句吧...

    用户名:

    验证码:

站点信息

  • 网站名称:JavaStudy
  • 建站时间:2019-1-14
  • 网站程序:帝国CMS7.5
  • 文章统计242篇文章
  • 标签管理标签云
  • 统计数据百度统计
  • 微信公众号:扫描二维码,关注我们