SpringBoot中利用@Valid和@Validated进行参数校验

 更新时间:2024年09月02日 08:58:56   作者:一只小白()  
为了保证数据的正确性、完整性,前后端都需要进行数据检验,作为一名后端开发工程师,不能仅仅依靠前端来校验数据,我们还需要对接口请求的参数进行后端的校验,所以本文给大家介绍了SpringBoot中利用@Valid和@Validated进行参数校验,需要的朋友可以参考下

一、什么是参数校验

例如在某个登录请求中传递参数包含用户信息,需要判断用户信息是否为空,以及判断邮箱是否为空等情况,正常处理会写大量的If else 语句非常影响美观,可读性也非常低,因此提出了参数校验这个概念,也就是下文介绍的@Valid和@Validated注解

@Controller
@RequestMapping("/user")
public class UserControlelr {
    @PostMapping("/login")
    public String login(UserDTO userDTO){
        if (userDTO.getUsername() == null || userDTO.getUsername().isEmpty()){
            // 进行某种操作
        }
        if(userDTO.getEmail() == null || userDTO.getEmail().isEmpty()){
            // 进行某种操作
        }
        return "loginSuccess";
    }
}

二、@Valid和@Validated注解的异同

标注位置

  • @Validated : 用在类、方法和方法参数上,但不能用于成员属性。
  • @Valid:可以用在方法、构造函数、方法参数和成员属性上。

分组校验

  • @Validated :支持分组验证,可以更细致地控制验证过程。
  • @Valid:主要支持标准的Bean验证功能,不支持分组验证。

嵌套校验

  • @Validated :不支持嵌套验证。
  • @Valid:支持嵌套验证,可以嵌套验证对象内部的属性。

三、常用校验注解

注解校验作用
@NotBlank用在String 上面,一般用来校验String类型不能为空,而且调用trim()后,长度必须大于0。
@NotEmpty用在集合上面,一般用来校验List类型(不能注释枚举),而且长度必须大于0
@NotNull验证字段不为 null。一般用于数字类型。
@Min(value)限制必须为一个不小于指定值的数字
@Max(value)限制必须为一个不大于指定值的数字
@past限制元素(日期类型)必须是一个过去的日期
@Future限制元素(日期类型)必须是一个将来的日期
@Email限制的元素值为是电子邮件地址
@Patern(value)限制必须符合指定的正则表达式

四、如何使用

1、普通参数校验

即直接检验像String、Interger这些普通参数

注意,要在controller上加入@Validated注解才能生效

@RestController
@Validated
public class Test1Controller {

    @PostMapping("/test1")
    public String test1(@NotEmpty String username, @Max(5) Integer value){
        return "校验普通参数";
    }

在Apifox上测试,会显示错误信息

在这里插入图片描述

2、对象参数校验

UserDTO.java

@Data
public class UserDTO {
    /**
     * 用户名
     */
    @NotBlank
    private String username;

    /**
     * 密码
     */
    @NotBlank
    private String pasword;

    /**
     * 邮箱
     */
    @Email
    private String email;
}

在参数的DTO上加入@Valid和@Validated效果是一样的

@RestController
public class Test2Controller {
    @PostMapping("/test2")
    public String test2(@Valid @RequestBody UserDTO userDTO){
        return "对象参数验证";
    }
}

在Apifox上测试,会显示错误信息

在这里插入图片描述

3、集合参数校验

注意,要在controller上加入@Validated注解才能生效

@RestController
@Validated
public class Test3Controller {
    @PostMapping("/test3")
    public String test3(@Valid @RequestBody List<UserDTO> userDTOList){
        return "集合参数校验";
    }
}

在Apifox上测试,会显示具体第几个变量的哪几个参数有错误

在这里插入图片描述

4、嵌套校验

UserListDTO.java

@Data
public class UserListDTO {
    /**
     * List的name
     */
    @NotBlank
    private String listName;

    /**
     *  User列表
     */
    @Valid
    private List<UserDTO> userDTOList;
}
@RestController
public class Test4Controller {
    @PostMapping("/test4")
    public String test4(@Validated @RequestBody UserListDTO userListDTO){
        return "嵌套参数校验";
    }
}

在Apifox上测试,会显示具体第几个变量的哪几个参数有错误

在这里插入图片描述

以上就是SpringBoot中利用@Valid和@Validated进行参数校验的详细内容,更多关于SpringBoot @Valid和@Validated参数校验的资料请关注脚本之家其它相关文章!

相关文章

  • Java中NoClassDefFoundError异常的原因及解决方法

    Java中NoClassDefFoundError异常的原因及解决方法

    在 Java 开发中,java.lang.NoClassDefFoundError 是运行时异常中最常见的问题之一,它通常出现在程序编译成功后,却在运行时因 JVM 无法找到某个类的定义 而抛出,本文给大家介绍了Java中NoClassDefFoundError异常的原因及解决方法,需要的朋友可以参考下
    2025-05-05
  • Java中的CAS(Compare-And-Swap)操作示例详解

    Java中的CAS(Compare-And-Swap)操作示例详解

    CAS是一种原子操作,用于在多线程环境中实现无锁(lock-free)的线程安全编程,下面通过本文给大家介绍Java中的CAS(Compare-And-Swap)操作示例详解,感兴趣的朋友一起看看吧
    2025-06-06
  • SpringBatch简单入门案例

    SpringBatch简单入门案例

    文章介绍了SpringBatch批处理框架的使用,包括其基本概念、优势、架构以及入门案例,通过简单的任务和数据库连接配置,展示了如何使用SpringBatch进行基本的批处理操作,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • Java内部类的实现原理与可能的内存泄漏说明

    Java内部类的实现原理与可能的内存泄漏说明

    这篇文章主要介绍了Java内部类的实现原理与可能的内存泄漏说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • JAVA对象分析之偏向锁、轻量级锁、重量级锁升级过程

    JAVA对象分析之偏向锁、轻量级锁、重量级锁升级过程

    这篇文章主要介绍了JAVA对象分析之偏向锁、轻量级锁、重量级锁升级过程,又对这方面感兴趣的同学可以跟着一起研究下
    2021-02-02
  • Java中的Future获取任务返回值详解

    Java中的Future获取任务返回值详解

    这篇文章主要介绍了Java中的Future获取任务返回值详解,在向线程池ThreadPoolExecutor提交任务时,一般为了方便操作采用execute提交任务,这时线程其实是无返回值的,需要的朋友可以参考下
    2023-12-12
  • Spring-AOP @AspectJ切点函数之@annotation()用法

    Spring-AOP @AspectJ切点函数之@annotation()用法

    这篇文章主要介绍了Spring-AOP @AspectJ切点函数之@annotation()用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java监听POST请求的示例详解

    Java监听POST请求的示例详解

    要监听POST请求,我们可以使用Java中的HttpServlet类,以下是一个使用Servlet API监听POST请求的完整示例,通过代码示例讲解的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2024-12-12
  • java不同线程解读以及线程池的使用方式

    java不同线程解读以及线程池的使用方式

    这篇文章主要介绍了java不同线程解读以及线程池的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Nebula Graph介绍和SpringBoot环境连接和查询操作

    Nebula Graph介绍和SpringBoot环境连接和查询操作

    Nebula Graph 是一款开源的、分布式的、易扩展的原生图数据库,能够承载包含数千亿个点和数万亿条边的超大规模数据集,并且提供毫秒级查询,这篇文章主要介绍了Nebula Graph介绍和SpringBoot环境连接和查询,需要的朋友可以参考下
    2022-10-10

最新评论