今天就跟大家聊聊有关如何进行数据校验Java Bean Validation 2.0,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
我们知道通常情况下程序肯定是分层的,不同的层一般由不同的人来开发。若你是一个有经验的程序员, 我相信你肯定见过在不同的层了都出现了相同的校验代码,这就是某种意义上的垃圾代码。 为了解决这个问题,Bean Validation
为 JavaBean
验证定义了相应的元数据模型和 API。默认的元数据是各种Java Annotations
,当然也支持xml方式并且你也可以扩展~可以说Bean Validation
是JavaBean
的一个拓展,它可以布局于任意一层代码,不局限于Web应用还是端应用。
Java Bean Validation
JSR是Java Specification Requests
的缩写,意思是Java 规范提案。关于数据校验这块,最新的是JSR380
,就是JSR第380号标准。Bean Validation
是一个通过配置注解来验证参数的框架,它包含两部分Bean Validation API
(规范)和Hibernate Validator
(实现)。
对Java的最低版本要求是Java 8
支持容器的校验,通过TYPE_USE类型的注解实现对容器内容的约束:`List<@Email String>`
支持日期/时间的校验,@Past
和@Future
拓展元数据(新增注解):@Email,@NotEmpty,@NotBlank,@Positive, @PositiveOrZero,@Negative,@NegativeOrZero,@PastOrPresent和@FutureOrPresent
像@Email、@NotEmpty、@NotBlank
之前是Hibernate额外提供的,2.0标准后hibernate自动退位让贤并且标注为过期了
Bean Validation 2.0
的唯一实现为Hibernate Validator
。(其实还有Apache BVal
,但是你懂的,forget it)
对于Hibernate Validator
,它自己也扩展了一些注解支持。
所以,对于Java Bean Validation
的实现落地产品就没啥好选的,导入Hibernate Validator
(最新版本)吧:
POM加入
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.17.Final</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-el</artifactId>
<version>8.5.29</version>
<!--<scope>provided</scope> 打包时最用此scope-->
</dependency>
编写一个Java Bean
@Getter
@Setter
@ToString
public class Person {
// 错误消息message是可以自定义的
@NotNull(message = "名字不能为null")
public String name;
@Positive
public Integer age;
@NotNull
@NotEmpty
private List<@Email String> emails;
@Future
private Date start;
}
public static void main(String[] args) {
Person person = new Person();
//person.setName("fsx");
person.setAge(-1);
// email校验:虽然是List都可以校验哦
person.setEmails(Arrays.asList("fsx@gmail.com", "baidu@baidu.com", "aaa.com"));
//person.setStart(new Date()); //start 需要是一个将来的时间: Sun Jul 21 10:45:03 CST 2019
//person.setStart(new Date(System.currentTimeMillis() + 10000)); //校验通过
// 对person进行校验然后拿到结果(显然使用时默认的校验器) 会保留下校验失败的消息
Set<ConstraintViolation<Person>> result = Validation.buildDefaultValidatorFactory().getValidator().validate(person);
// 对结果进行遍历输出
result.stream().map(v -> v.getPropertyPath() + " " + v.getMessage() + ": " + v.getInvalidValue())
.forEach(System.out::println);
//用hibernateValidator
HibernateValidatorConfiguration configuration = Validation.byProvider(HibernateValidator.class)
.configure()
.failFast(false);
ValidatorFactory validatorFactory = configuration.buildValidatorFactory();
Set<ConstraintViolation<TestBean>> sets= validatorFactory.getValidator().validate(person);
sets.stream().map(v->v.getPropertyPath()+" " +v.getMessage()+":"+v.getInvalidValue()).forEach(System.out::println);
}
运行mian函数,控制台打印输出
name名字不能为null: null // 此处错误消息是自己的自定义内容
age必须是正数: -1
emails[2].<list element>不是一个合法的电子邮件地址: aaa.com
常见的验证规则如下:
@AssertFalse 验证boolean类型只能为false
@AssertTrue 验证boolean类型只能为true
其它一些规则详见:
javax.validation.constraints包下
官方给它的定义为:This class is the entry point for Bean Validation.
它作为校验的入口,有三种方式来启动,这里主要看最常见的启动方式:
最简单方式:使用默认的ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
可以直接提供一个类型安全的ValidationProvider
实现。比如HibernateValidator
就是一个ValidationProvider
的实现:
HibernateValidatorConfiguration configuration = Validation.byProvider(HibernateValidator.class)
// .providerResolver( ... ) // 因为制定了Provider,这个参数就可选了
.configure()
.failFast(false);
ValidatorFactory validatorFactory = configuration.buildValidatorFactory();
看完上述内容,你们对如何进行数据校验Java Bean Validation 2.0有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/u/3242075/blog/3078371