Java中Validated、Valid 、Validator区别详解

yizhihongxing

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日

相关文章

  • MySQL 数据库(一):创建数据库、创建表

    创建数据库 语法:(译:亏诶特。得特贝斯) create database 示例:创建数据库 test; create database test; 创建表 语法:(译:亏诶特。tei bou) create table 表名 (字段1 类型1,字段2 类型2,字段3 类型3) DEFAULT CHARSET=utf8; 解释: 字段名:用来标识表的一列 字…

    MySQL 2023年4月13日
    00
  • Hue 和 Pig 的区别

    Hue与Pig是Apache Hadoop生态系统中两个不同的工具。它们都是为大数据处理而设计的,但它们的设计思想和主要任务不同。下面我们来详细讲解它们之间的区别。 Hue 概述 Hue是Apache Hadoop生态系统中的一个Web界面工具,可以帮助用户轻松地使用Hadoop平台的各种功能,例如:文件管理、Hive查询、Oozie工作流、Spark和Pi…

    database 2023年3月27日
    00
  • Linux中Oracle服务启动和停止脚本与开机自启动

    下面是Linux中Oracle服务启动和停止脚本与开机自启动的完整攻略。 介绍 Oracle是一个非常流行的关系型数据库软件,在Linux系统中也被广泛使用。在使用Oracle之前,需要通过脚本启动和停止Oracle服务,并且可以配置Oracle服务在系统启动时自动启动。 启动Oracle服务 为了启动Oracle服务,我们需要使用系统管理员的身份登录到Li…

    database 2023年5月22日
    00
  • PostgreSQL之连接失败的问题及解决

    PostgreSQL之连接失败的问题及解决 PostgreSQL是一个开源的、高度可扩展的关系型数据库管理系统,在使用过程中可能会遇到连接失败的问题,本文将介绍如何解决这个问题。 问题分析 当连接PostgreSQL时,可能会出现以下错误提示: FATAL: could not connect to server: Operation timed out (…

    database 2023年5月21日
    00
  • Linux下修改MySQL数据库数据文件路径的步骤

    下面我将为你详细讲解如何在Linux下修改MySQL数据库数据文件路径。 1. 停止MySQL服务 在修改MySQL数据文件路径前,需要先停止MySQL服务。可以使用以下命令停止MySQL服务: sudo systemctl stop mysql 2. 复制数据文件 将原本MySQL数据文件复制到新的路径下。例如,将数据文件从 /var/lib/mysql …

    database 2023年5月18日
    00
  • spring aop execution表达式的用法

    关于“spring aop execution表达式的用法”,我将为您提供完整的攻略。 什么是Spring AOP Execution表达式? Spring AOP 是Spring框架的一个重要模块。它提供了一个机制来优雅地在对象上进行横向切面编程,使程序的功能得到增强。Spring AOP Execution表达式是Spring AOP的一部分,通常用于创…

    database 2023年5月21日
    00
  • Java中性能优化的35种方法汇总

    Java中性能优化的35种方法汇总 Java中性能优化是一个复杂的过程,需要从多个方面入手来进行优化。下面列出Java中性能优化的35种方法,供参考。 一、代码级别的优化 1. 避免使用全局变量与静态变量 使用全局变量和静态变量会增加内存的使用,降低程序执行效率。应尽量避免使用。 2. 避免不必要的参数传递 尽量不要把不必要的参数传递给方法,只传递必要的参数…

    database 2023年5月19日
    00
  • 用PHP调用Oracle存储过程

    下面我将给你详细讲解“用PHP调用Oracle存储过程”的完整攻略。 1. 安装Oracle驱动程序 要使用PHP调用Oracle存储过程,我们首先需要安装Oracle官方提供的驱动程序。可以在这个页面下载适合自己系统的驱动版本。下载后,解压缩到合适的位置,并将解压缩后的路径添加到系统环境变量中。其实,我们最好将Oracle的路径设置为PATH环境变量中,这…

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