SpingBoot项目使用@Validated和@Valid参数校验

一、什么是参数校验?

我们在后端开发中,经常遇到的一个问题就是入参校验。简单来说就是对一个方法入参的参数进行校验,看是否符合我们的要求。比如入参要求是一个金额,你前端没做限制,用户随便过来一个负数,或者一个字母,那么我们的接口就会报错。

所以,通常我们需要在方法的开始处,对入参的参数进行校验,不符合要求就报错返回,不往下进行。这个校验的过程就是参数校验。


二、为什么需要统一参数校验?

明白了什么是参数校验,我们继续来看下个问题。现在我们就要加参数校验了,如果是一个方法,那很容易。但是如果一个项目的所有接口方法都需要校验呢?想想就头大,会出现很多重复且繁琐的代码,而且校验代码和业务代码混在一起,耦合太重。那么如何解决呢?

这就是今天我们的第二个问题,我们需要统一参数校验。这里我们可以通过注解来进行切面参数校验。只需要在想要校验的方法上,加上相应的注解,方法在执行时,就会先走我们的切面方法,对入参进行校验。这样通过统一参数校验,就解决了上面我们提到的耦合、重复等问题。

当然,这个校验注解其实有人已经给我们提供了,有现成好用的了。这就是今天我们的主角Spring Validator框架和Javax Valid。


三、@Validated和@Valid区别

上面我们提到了,参数校验已经有现成的框架了,一个是Spring Validator框架,一个是Javax Valid,那么这两个有什么区别呢?

先说Javax Valid,这个是Java核心包给我们提供的,包名是validation-api。它遵循的是标准JSR-303规范,这个规范其实就是一个校验标准。因为是Java提供的,所以我们使用时不需要单独引入。它提供的最常使用的注解就是@Valid。

再说Spring Validator,它是Spring提供的,底层其实是对hibernate-validator的二次封装。hibernate-validator是上面提到的标准JSR-303规范的变种,但是大多数还是基于上述规范实现。Validator框架提供的最常使用的注解就是我们提到的@Validated。

两者在使用上区别不少,先看使用地方:

  • @Validated:可以用在类型、方法和方法参数上。但是不能用在成员属性(字段)上
  • @Valid:可以用在方法、构造函数、方法参数和成员属性(字段)上

另外@Validated支持分组校验,@Valid作为标准JSR-303规范,还没有支持分组校验。但是它支持加在字段上,所以支持嵌套校验。这些具体区别,我们在下面的文章都会提到。

概念都弄明白了,我们继续下个问题,就是如何使用它们?


四、如何使用@Validated和@Valid等注解参数校验?

这里我们还是以SpringBoot项目为例:

1、先引入jar包,上面已经说过了,Valid是Javax提供的,所以我们不需要引入。只需要引入Spring Validator就可以。


    org.springframework.boot
    spring-boot-starter-validation

复制代码

我们点进去spring-boot-starter-validation包可以看到,实质上引入的还是hibernate-validatro。

SpingBoot项目使用@Validated和@Valid参数校验_第1张图片

备注:这里注意一下,Spring Boot 2.3以前的版本是默认引入了spring-boot-starter-validation的,不需要额外引入。以下是官网说明:

SpingBoot项目使用@Validated和@Valid参数校验_第2张图片

2、一般来说我们只需要对提供给前端的接口或者对外提供服务的接口进行校验即可。

3

你可能感兴趣的:(spring,java,hibernate)