Java Validation 简单使用
背景
通常要处理一个应用程序的业务逻辑,数据校验是必须要考虑和面对的事情。应用程序必须通过某种手段来确保输入进来的数据从语义上来讲是正确的。很多时候同样的数据验证逻辑会出现在不同的层,这样就会导致代码冗余和一些管理的问题,比如说语义的一致性等。为了避免这样的情况发生,最好是将验证逻辑与相应的域模型进行绑定。
Java 的 Validation框架 就是解决这个问题的。下面通过实例了解简单的使用方式。
创建工程
通过gradle
image.png image.png修改maven代理
buildscript {
repositories {
maven { url "xx" }
}
}
repositories {
// Use jcenter for resolving your dependencies.
// You can declare any Maven/Ivy/file repository here.
maven { url "xx" }
}
开始使用
添加依赖
implementation 'javax.validation:validation-api:2.0.1.Final'
implementation 'org.hibernate.validator:hibernate-validator:6.0.16.Final'
implementation 'org.glassfish:javax.el:3.0.1-b09'
编写代码
data class Order(
@field:Size(min=10, max=10) val orderId: String,
@field:NotEmpty val customer: String,
@field:Email val email: String,
@field:Valid val product: Product)
data class Product(
@field:NotEmpty val productName: String,
val price: Float
)
fun main() {
val order = Order("1", "name", "123", Product("product1", 10.10f))
val factory = Validation.buildDefaultValidatorFactory()
val validator = factory.validator
val validations = validator.validate(order)
println(validations)
}
总结
Bean Validation 中的 constraint
Constraint 详细信息
@Null 被注释的元素必须为 null
@NotNull 被注释的元素必须不为 null
@AssertTrue 被注释的元素必须为 true
@AssertFalse 被注释的元素必须为 false
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max, min) 被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past 被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
@Pattern(value) 被注释的元素必须符合指定的正则表达式
Hibernate Validator 附加的 constraint
Constraint 详细信息
@Email 被注释的元素必须是电子邮箱地址
@Length 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空
@Range 被注释的元素必须在合适的范围内
对于嵌套的对象验证需要加入@Valid 注解
思考
验证框架的核心思想是:将验证逻辑与相应的域模型进行绑定。以便于在系统的各个层次上复用校验逻辑。同时也保证了业务代码的简洁性。
参考资料
https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#validator-gettingstarted
https://docs.oracle.com/en/java/javase/12/
https://www.kotlincn.net/docs/reference/annotations.html
https://www.ibm.com/developerworks/cn/java/j-lo-jsr303/index.html