beanvalidation简介
不相关的很多java package组成了javaee规范;api(没有实现),具体是由不同的厂商来实现这些规范的
# javax开头的包
javax.sql----mysql,sqlserver,oracle
javax.jms--- activemq
javax.servlet---tomcat,jetty
javax.persistence----hibernate
javax.transaction----分布式事务
javax.xml----jaxp: java api for xml processing
# 并不是只有这么多,而是jdk默认带了一些常用的javaee规范。对于没有带的,如果要使用,就要自己引入了,比如beanvalidation
提案号 | beanvalidation版本 |
---|---|
jsr303 | beanvalidation 1.0 |
jsr349 | beanvalidation 1.1 |
jsr380 | beanvalidation 2.0 |
-
javax会逐渐走向jakarta,oracle把javaee规范捐献给eclipse基金会,javax会逐渐改名为jakarta
-
不要将apache的jakarta与当前Jakarta混淆
-
apache的jakarta在2011退休了
-
搭建项目
<!--引入beanvalidation-->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<!--jakarta规范的版本,和javax版本内容一样,就是包名不同-->
<!-- <dependency>-->
<!-- <groupId>jakarta.validation</groupId>-->
<!-- <artifactId>jakarta.validation-api</artifactId>-->
<!-- <version>2.0.1</version>-->
<!-- </dependency>-->
<!--引入hibernate-validator-->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.18.Final</version>
</dependency>
<!--el 规范和tomcat的实现,用于解析messages里面的表达式-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-el</artifactId>
<version>9.0.29</version>
</dependency>
- 传统校验方式
public class UserInfo {
private Long id;
private String name;
private Integer age;
private String email;
private String phone;
private LocalDateTime birthDay;
private String personalPage;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public LocalDateTime getBirthDay() {
return birthDay;
}
public void setBirthDay(LocalDateTime birthDay) {
this.birthDay = birthDay;
}
public String getPersonalPage() {
return personalPage;
}
public void setPersonalPage(String personalPage) {
this.personalPage = personalPage;
}
}
- 测试
public class ValidationTest {
public static void main(String[] args) {
UserInfo userInfo = new UserInfo();
test1(userInfo);
}
// 使用传统的方式来校验bean
private static void test1(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 < 800;
if (!ageValidate) {
throw new RuntimeException("age不符合校验规则,应在(1-800)");
}
// ......
}
}
使用Validator
public class ValidationUtil {
// 线程安全
private static Validator validator;
static {
validator = Validation.buildDefaultValidatorFactory().getValidator();
}
public static List<String> valid(UserInfo userInfo){
// 如果被校验对象userInfo没有校验通过,则set里面就有校验信息
Set<ConstraintViolation<UserInfo>> set = validator.validate(userInfo);
List<String> list = set.stream().map(v -> "属性:" + v.getPropertyPath() +
",属性的值:"
+ v.getInvalidValue() + ",校验不通过的提示信息:" + v.getMessage())
.collect(Collectors.toList());
return list;
}
}
- 测试
public class UserInfo {
@NotNull
private String name;
}
public class ValidationTest {
public static void main(String[] args) {
UserInfo userInfo = new UserInfo();
List<String> list = ValidationUtil.valid(userInfo);
System.out.print(list);
}
}
- 内置约束
@Null 被注释的元素必须为null
@NotNull 被注释的元素必须不为null
@NotEmpty 被注释的集合(size>0)/字符串(!=null&&!"")
@NotBlank !=null&&!""&&!" "
@AssertTrue 被注释的元素必须为 true
@AssertFalse 被注释的元素必须为 false
@Min(value) 被注释的元素必须是一个数字,>=
@Max(value) 被注释的元素必须是一个数字,<=
@DecimalMin(value) >=
@DecimalMax(value) <=
@Size(max, min) 被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past 被注释的元素必须是一个过去的日期
@PastOrPresent 时间
@NegativeOrZero <=0
@Future 被注释的元素必须是一个将来的日期
@Pattern(value) 被注释的元素必须符合指定的正则表达式
@Email 被注释的元素必须是电子邮箱地址
- 附加约束
@Length 被注释的字符串的大小必须在指定的范围内
@Range 被注释的元素必须在合适的范围内
@URL 一个url
- 案例
public class UserInfo {
private Long id;
// @NotNull // 只校验不为null
// @NotEmpty // !=null&&!""
@NotBlank(message = "你的名字不能为空") // !=null&&!""&&!" "
private String name;
@NotNull
// @Min(1) @Max(800) // 闭区间,什么时候生效?!=null
// @Range(min = 1,max = 800) // 闭区间
@Min(value = 18,message = "年龄小于{value}岁,禁止进入")
private Integer age;
@NotBlank
@Email
private String email;
@Pattern(regexp = "^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,5-9]))\\d{8}$")
private String phone;
@NotNull
@Past // 不能是未发生的时间
private LocalDateTime birthDay;
@URL
private String personalPage;