使用Hibernate Validation进行优雅的参数校验

本文介绍了如何利用Hibernate Validation框架进行优雅的参数校验,避免繁琐的手动判断。Hibernate Validator作为JSR 303规范的实现,提供了一次编写、统一校验的便利,降低了代码耦合度,提高了开发效率。文章详细讲解了如何在Controller和Service层使用@Valid和@Validated注解,以及各种常用的校验注解,如@NotNull、@Size、@Email等,并提到了Fail-Fast机制和处理平铺参数的方法。

使用Hibernate Validation进行优雅的参数校验

开发中,我们需要在controller,service等层对传来的参数进行校验判断。

比如判断参数是否为null,数字是否符合规定大小,字符串格式是否正确。

如果我们在每个controller里面都进行判断,即繁琐也容易失误。而Hibernate Validator校验框架可以帮我们从繁琐的参数校验中脱离出来,进行更有质量的开发。

Hibernate Validator 是 Bean Validation 的参考实现。Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint 的实现,除此之外还有一些附加的 constraint。

Hibernate Validator的优点:

  1. 将业务代码和校验代码分离开来,降低程序耦合度,使代码逻辑更加清晰。
  2. 不用重复编写验证逻辑,一次编写,统一校验。
  3. 定制校验信息,返回前台信息统一。
  4. 提高开发效率,尽可能的降低程序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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值