使用Hibernate Validation进行优雅的参数校验
开发中,我们需要在controller,service等层对传来的参数进行校验判断。
比如判断参数是否为null,数字是否符合规定大小,字符串格式是否正确。
如果我们在每个controller里面都进行判断,即繁琐也容易失误。而Hibernate Validator校验框架可以帮我们从繁琐的参数校验中脱离出来,进行更有质量的开发。
Hibernate Validator 是 Bean Validation 的参考实现。Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint 的实现,除此之外还有一些附加的 constraint。
Hibernate Validator的优点:
- 将业务代码和校验代码分离开来,降低程序耦合度,使代码逻辑更加清晰。
- 不用重复编写验证逻辑,一次编写,统一校验。
- 定制校验信息,返回前台信息统一。
- 提高开发效率,尽可能的降低程序bug。
引入jar包
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.17.Final</version>
</dependency>
如果是springboot项目,则不需再次引入,spring-boot-starter-web中已经包含了此依赖。
很多时候数据校验都是针对domain模型的,而Hibernate Validator对domain模型校验也非常方便,比如 :
public class Article {
@NotBlank(message = "标题不能为空")
private String title;
@NotBlank(message = "作者不能为空")
private String author;
@NotBlank(message = "文章内容不能为空")
private String detail;
}
然后在Controller层使用注解@Valid进行校验
@PostMapping
public ResponseDTO publish(@Valid @RequestBody Article article){
articleService.publishArticle(article);
return new ResponseDTO(Constant.CODE_OK, Constant.CODE_OK_MSG);
}
当访问此Controller时,就会校验数据:

但是如过同时有多个条件不满足,默认是全部都验证一遍,可以通过设置Fail-Fast为true,当第一个条件验证失败时,直接返回错误信息,不再进行后续判断。
@Bean
public Validator validator(){
ValidatorFactory validatorFactory = javax.validation.Validation.byProvider( HibernateValidator.class )
.configure()
.failFast(true)
.buildValidatorFactory();
return validatorFactory.getValidator();
}
但有时方法参数中并不是一个对象,而是平铺参数,比如:
@GetMapping
public ResponseDTO listArticle(@RequestParam String keywords){
List<Article> articles = articleService.listWithPages(keywords);
return new ResponseDTO(Constant.CODE_OK, Constant.CODE_OK_MSG, articles);
}
此时可以使用Spring提供的基于方法Method的JSR校验的核心处理器,在类上使用@Validated标签:

@GetMapping
public ResponseDTO listArticle(@RequestParam @NotBlank(message = "关键词不能为空") String keywords){
List<Article> articles = articleService.listWithPages(keywords);
return new ResponseDTO(Constant.CODE_OK, Constant.CODE_OK_MSG, articles);
}
请求参数不正确则返回:

对于其他层比如service层,参数校验和controller层类似,其中@Validated标签使用在接口或实现类都行,方法参数标签需要用在接口中的方法定义里面,如下:
List<Article> listWithPages(@NotBlank(message = "关键词不能为空") String keywords);
需要深入了解的:
Springboot @Validated和@Valid的区别 及使用
让Controller支持对平铺参数执行@Valid数据校验
常用的标签有:
- Bean Validation 中内置的 constraint
- @Null 被注释的元素必须为 null
- @NotNull 被注释的元素必须不为 null
- @AssertTrue 被注释的元素必须为 true
- @AssertFalse 被注释的元素必须为 false
- @Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
- @Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
- @Size(max=, min=) 被注释的元素的大小必须在指定的范围内
- @Digits (integer, fraction) 被注释的元素必须是一个数字,integer指定整数段位数,fraction指定小数位数
- @Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式
- Hibernate Validator 附加的 constraint
- @NotBlank(message =) 验证字符串非null,且长度必须大于0
- @Email 被注释的元素必须是电子邮箱地址
- @Length(min=,max=) 被注释的字符串的长度必须在指定的范围内
- @NotEmpty 非null且非空,支持CharSequence,Collection,Map,Array
- @Range(min=,max=,message=) 被注释的元素大小必须在合适的范围内,数值或字符串型数值
更加全面系统的学习:
Hibernate Validator Document
Hibernate Validator - Bean Validation 2.0 (JSR 380) Reference Implementation
本文介绍了如何利用Hibernate Validation框架进行优雅的参数校验,避免繁琐的手动判断。Hibernate Validator作为JSR 303规范的实现,提供了一次编写、统一校验的便利,降低了代码耦合度,提高了开发效率。文章详细讲解了如何在Controller和Service层使用@Valid和@Validated注解,以及各种常用的校验注解,如@NotNull、@Size、@Email等,并提到了Fail-Fast机制和处理平铺参数的方法。
2013

被折叠的 条评论
为什么被折叠?



