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就可以。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>
复制代码

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

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

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

3

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`@Validated`注解是Spring框架提供的一种参数校验注解。它可以用来替代Java标准库中的`@Valid`注解,并且支持分组校验等功能。 `@Validated`注解可以用在类、方法、构造函数、方法参数以及方法返回值上。它的作用是启用方法参数校验。当方法被调用时,如果参数上标注了`@Validated`注解,则会对该参数进行校验。如果校验失败,则会抛出`MethodArgumentNotValidException`异常。 除了支持Java标准库中的参数校验注解之外,`@Validated`注解还支持分组校验功能。即可以根据不同的校验场景,对同一个类中的不同属性进行不同的校验。例如: ```java public interface Update { } public interface Create { } public class User { @NotNull(groups = Update.class) private Long id; @NotBlank(groups = {Create.class, Update.class}) private String name; @Min(value = 18, message = "年龄不能小于18岁", groups = {Create.class, Update.class}) private Integer age; // 省略getter和setter方法 } ``` 在上面的代码中,定义了两个分组`Create`和`Update`,并在`User`类中使用了分组校验注解。其中,`id`属性只在更新用户信息时进行校验,`name`和`age`属性在创建和更新用户信息时都需要进行校验。当进行校验时,需要指定对应的分组,例如: ```java @RestController @RequestMapping("/user") @Validated public class UserController { @PostMapping("/create") public ResponseEntity createUser(@RequestBody @Validated(Create.class) User user) { // ... } @PostMapping("/update") public ResponseEntity updateUser(@RequestBody @Validated(Update.class) User user) { // ... } } ``` 在上面的代码中,`@Validated(Create.class)`注解表示对`User`对象中标注了`Create`分组的属性进行校验,`@Validated(Update.class)`注解表示对`User`对象中标注了`Update`分组的属性进行校验。 综上所述,`@Validated`注解可以用来替代Java标准库中的`@Valid`注解,并且支持分组校验等功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值