您现在的位置是:首页 > 后台技术 > JavaJava
代码简洁之道-validation
第十三双眼睛2023-08-30【Java】人已围观
简介代码简洁之道-validation
代码简洁之道-validation
beanvalidation官网:https://beanvalidation.org/ 它是接口
hibernatevalidater官网:https://hibernate.org/validator/ 它是最佳实现
使用方法:
1:引入依赖
2:定义一个用来校验的类
3:定义一个校验工具类
编写一个主方法
运行程序,可以看到控制台打印出了提示,id不能为null
常用的注解:
@NotNull:要求属性不能为null
@Null:要求属性必须为null
@NotBlank:要求属性不能为空白字符串
@NotEmpty:要求集合的长度不能为0
@Min:最小值 不校验null
@Max:最大值 不校验null
@Pattern(regexp = ""):属性要满足指定的正则表达式
级联校验:当一个类里面有一个属性也是一个类,这个类也需要被校验,这个时候可以加@Valid注解,就可以进行级联校验了
当同一个类的同一个参数在不同的接口,有的接口种可以为null,但是有的接口不能为null,此时就需要指定groups属性,建一个内部类即可。
快速失败:当对象种有多个属性会校验不通过时,没有必要全部校验一遍,校验道第一个不通过时,直接返回就行,这就是快速失败。这时候就不能用默认的校验器了,
需要进行配置。
运行程序,可以看到结果就只有一个校验结果,不会把所有的属性都校验一遍了。
非bean入参校验
调用validNotBean方法即可校验。
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> |
@Data @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode public class User { @NotNull(message = "id不能为空") private Long id; private String name; } |
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); } } |
常用的注解:
@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; } } |
Tags:
很赞哦! ()
下一篇:彻底搞懂字符编码(图文)
相关文章
随机图文
-
redis类型转换异常(图文)
在开发的过程中,偶然遇到一次将一个对象放入redis,然后取出来,进行类型转换却报错,按道理说不应该,网上查了好多资料都不对,最好找到了答案,记录一下 -
Log4j日志学习(图文)
在java项目中,日志非常重要,对于监控系统是否正常运行,以及出了问题快速修复有很大的帮助。 -
JSP简要记录
这节主要记录JSP中一些有用的东西 -
微服务springcloudalibaba(图文)
阿里云为分布式应用开发提供了一站式解决方案。它包含了开发分布式应用程序所需的所有组件,使您可以轻松地使用springcloud开发应用程序。 - 有了阿里云,你只需要添加一些注解和少量的配置,就可以将Spring云应用连接到阿里的分布式解决方案上,用阿里中间件搭建一个分布式应用系统。