Java中Validated、Valid 、Validator区别详解

Java中Validated、Valid 、Validator区别详解

背景介绍

在Java中,我们经常会使用各种注解来实现校验的功能。其中,@Valid、@Validated和Validator三种方式是比较常用的。本文将详细讲解它们的区别。

@Validated与@Valid注释

@Validated@Valid注释是两种校验注释。它们的职责是调用验证框架处理带注释的参数、方法返回值和字段。它们的作用是在控制器类的方法或方法参数上进行校验,主要校验常规数据类型,如String、Integer、Boolean。两者区别在于,@Validated更加强制性,会检测方法、属性、方法参数等,而@Valid注释只支持方法参数。

示例代码如下:

@GetMapping("/user")
public User getUserInfo(@Validated @RequestParam("id") Integer id) {...}

@PostMapping("/user")
public void addUser(@RequestBody @Valid User user){...}

在上面的示例中,@Validated@Valid注释均用于参数上,实现对参数的校验。这里的@RequestParam@RequestBody注释表示将请求参数自动绑定到方法参数。

Validator校验器

Validator是Java Bean Validation标准API的主要接口。它定义了一组用于验证Java Bean的方法,包括一些可自定义的约束注释。

示例代码如下:

public class UserValidator implements Validator {

    @Override
    public boolean supports(Class<?> clazz) {
        return User.class.equals(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
        User user = (User) target;
        if (user.getName() == null || user.getName().isEmpty()) {
            errors.rejectValue("name", "name.empty", "用户名不能为空");
        }

        if (user.getAge() != null && user.getAge() < 0) {
            errors.rejectValue("age", "age.invalid", "年龄必须大于等于0");
        }
    }
}

在上面的示例中,supports()方法用于判断是否支持校验对象,validate()方法则重写验证方法,实现了对用户对象的校验逻辑。

在实际使用中,我们可以使用Validator自定义注解,例如:

public class User {

    @NotNull(message = "用户名不能为空")
    private String name;

    @PositiveOrZero(message = "年龄必须大于等于0")
    private Integer age;

    //getter、setter方法省略

}

Java Bean Validation标准API提供了多种约束注释,如@NotNull@NotBlank@Positive等,可以方便地实现各种数据校验。

结论

总之,@Validated@Valid注释是用于控制器类和其方法参数上的校验注释,主要校验常规数据类型。而Validator是Java Bean Validation标准API的主要接口,其主要作用是提供了多种约束注释,可以方便地实现各种数据校验。

参考资料

  1. 官方文档:Bean Validation.
  2. 博客文章:Spring Boot数据校验(Valid 和 Validated)的区别.

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java中Validated、Valid 、Validator区别详解 - Python技术站

(0)
上一篇 2023年5月21日
下一篇 2023年5月21日

相关文章

  • 详解Docker 下开发 hyperf 完整使用示例

    本文将详细介绍在 Docker 环境下,如何使用 Hyperf 开发应用,并给出完整的使用示例。主要包括以下几个部分。 安装 Docker 本文的演示基于 Docker 环境,因此需要先安装 Docker。Docker 可以在多个平台上运行,如 Windows、macOS 和 Linux。这里以 macOS 为例进行说明。 在 macOS 上安装 Docke…

    database 2023年5月22日
    00
  • vue如何将对象中所有的key赋为空值

    下面是详细讲解“Vue如何将对象中所有的key赋为空值”的攻略: 一、使用Object.keys()和forEach或reduce 首先,使用Object.keys()获取该对象所有的key,返回一个数组。 然后,使用forEach或reduce(根据实际需求而定)遍历该数组,将对象中每个key的值赋为null或空字符串。 代码示例(使用forEach): …

    database 2023年5月18日
    00
  • oracle获取当前时间,精确到毫秒并指定精确位数的实现方法

    获取当前时间,精确到毫秒,并指定精度位数,可以通过TO_CHAR函数实现。下面是具体的步骤及示例说明。 使用SYSTIMESTAMP获取当前系统时间戳。 SELECT SYSTIMESTAMP FROM dual; 该语句会返回当前系统时间戳,比如以下示例输出的系统时间戳为: 09-NOV-21 04.50.15.379707 PM +00:00。 使用TO…

    database 2023年5月22日
    00
  • idea中使用mysql的保姆级教程(超详细)

    Idea中使用MySQL的保姆级教程 在Idea中操作MySQL可能是很多新手会遇到的问题。本篇攻略将从如下几个方面介绍Idea中使用MySQL的详细步骤: 安装MySQL 配置JDBC驱动 创建数据库连接 操作数据库 示例说明 1. 安装MySQL 首先需要安装MySQL数据库。可以在MySQL官网下载并按照提示安装。 2. 配置JDBC驱动 Idea需要…

    database 2023年5月18日
    00
  • oracle 字符串转成行

    下面是“Oracle字符串转成行”的详细攻略。 1. 概述 在Oracle数据库中,有时需要将一个字符串按照一定的规则转换成多行数据,这就需要使用字符串转行的工具函数。Oracle提供了多种方式实现字符串转行操作,本文将介绍其中的两种方式。 2. 使用connect by语句 connect by语句是Oracle中用于实现递归查询的语句。在字符串转行操作中…

    database 2023年5月21日
    00
  • 针对distinct疑问引发的一系列思考

    针对distinct疑问引发的一系列思考,完整攻略如下: 1. 理解distinct DISTINCT 是 SQL 中常用的关键字,用于筛选数据库中的唯一记录。例如,如果我们需要查询某个城市所有的居民姓名,由于一个城市可能有多个居民,因此在查询到数据后,我们需要把相同的居民姓名去重,这时就可以使用 DISTINCT 关键字来达到去重的目的。 下面是一个示例代…

    database 2023年5月21日
    00
  • 一文解析ORACLE树结构查询

    一文解析ORACLE树结构查询 什么是树结构 树结构是一种常见的数据结构,在各个领域都有着广泛的应用,如操作系统的文件系统、组织机构图等。树结构的每个节点都只能有一个父节点,但可以有多个子节点。 ORACLE树结构查询的关联查询方法 在ORACLE中,针对树结构,可以使用关联查询来进行查询。假设有一个名为t_tree的表,它包含以下字段:id、name、pa…

    database 2023年5月21日
    00
  • redis配置文件中常用配置详解

    关于“redis配置文件中常用配置详解”这个话题,我可以为你提供如下攻略: Redis配置文件中常用配置详解 1. Redis配置文件的位置 Redis配置文件名为redis.conf,一般情况下是位于Redis服务器的安装目录下的子目录中,具体路径根据安装方式有所不同。 2. Redis配置文件的格式与说明 Redis配置文件采用文本格式,每行由一个配置项…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部