展开
拓展 关闭
订阅号推广码
GitHub
视频
公告栏 关闭

beanvalidation简介

  • beanvalidation官网 -> 是规范,api,接口

  • hibernate-validator官网 -> 是beanvalidation的最佳实现

  • java EE规范

不相关的很多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
  • 该规范由jcp里面的成员制定

  • jcp官网

  • 在该组织中提出JavaSpecification Requests java规范提案,如beanvalidation的提案有如下3个

提案号 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;
posted @   DogLeftover  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
点击右上角即可分享
微信分享提示