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参数校验的资料请关注脚本之家其它相关文章!

相关文章

  • sprintboot使用spring-security包,缓存内存与redis共存方式

    sprintboot使用spring-security包,缓存内存与redis共存方式

    这篇文章主要介绍了sprintboot使用spring-security包,缓存内存与redis共存方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • SpringBoot使用AOP实现统计全局接口访问次数详解

    SpringBoot使用AOP实现统计全局接口访问次数详解

    这篇文章主要介绍了SpringBoot通过AOP实现对全局接口访问次数的统计,文章从相关问题展开全文内容详情,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-06-06
  • JAVA使用动态代理对象进行敏感字过滤代码实例

    JAVA使用动态代理对象进行敏感字过滤代码实例

    这篇文章主要介绍了JAVA使用动态代理对象进行敏感字过滤代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • 关于spring中定时器的使用教程

    关于spring中定时器的使用教程

    大家应该都有所体会,在很多实际的web应用中,都有需要定时实现的服务,下面这篇文章主要给大家介绍了关于spring中定时器的使用教程,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-06-06
  • 详解IDEA下Gradle多模块(项目)的构建

    详解IDEA下Gradle多模块(项目)的构建

    这篇文章主要介绍了详解IDEA下Gradle多模块(项目)的构建,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • maven多模块pom配置实例详解

    maven多模块pom配置实例详解

    这篇文章主要介绍了maven多模块pom配置实例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-01-01
  • 详解spring boot jpa整合QueryDSL来简化复杂操作

    详解spring boot jpa整合QueryDSL来简化复杂操作

    这篇文章主要介绍了详解spring boot jpa整合QueryDSL来简化复杂操作,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • 对ThreadLocal内存泄漏及弱引用的理解

    对ThreadLocal内存泄漏及弱引用的理解

    这篇文章主要介绍了对ThreadLocal内存泄漏及弱引用的理解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • 通过实例解析POJO和JavaBean的区别

    通过实例解析POJO和JavaBean的区别

    这篇文章主要介绍了通过实例解析POJO和JavaBean的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • @Scheduled 如何读取动态配置文件

    @Scheduled 如何读取动态配置文件

    这篇文章主要介绍了@Scheduled 如何读取动态配置文件的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06

最新评论