已校验、有效、校验器,你知道它们的区别吗

相关标签:1.阿里云提供 FIPS 认证的硬件安全模块用于密钥安全
2. 域名有效性

已校验、有效、校验器,你知道它们的区别吗

1. 结论先行
Valid VS Validated 相同点
•两种方法和参数都可以被校验
•@Valid 和 @Validated 两个注解都会触发标准 Bean 校验。
如果校验失败,将抛出 BindException 并返回 400(BAD_REQUEST)响应;或者可以通过控制器中的 Errors 或 BindingResult 参数本地处理校验错误。此外,如果参数前有 @RequestBody 注解,校验错误将抛出 MethodArgumentNotValidException 异常。
JSR 380
JSR 380 是 Bean 校验的 Java API 规范,是 Jakarta EE 和 Java SE 的一部分。确保 Bean 的属性满足特定条件,使用 @NotNull、@Min 和 @Max 等注解。

此版本需要 Java 8 或更高版本,并利用了 Java 8 中添加的新特性,例如类型注解以及对 Optional 和 LocalDate 等新类型的支持。
有关规范的完整信息,请继续阅读 JSR 380。

@Valid 和 @Validated 有什么区别?


javax.validation.Valid _
o是 JSR-303 规范的标准注解支持,是一个标记注解。
o注解支持 ElementType#METHOD、ElementType#FIELD、ElementType#CONSTRUCTOR,
oElementType#PARAMETER、ElementType#TYPE_USE
•org.springframework.validation.annotation.Validated _
o它是 Spring 制作的自定义注解,增强了分组功能。
o注解支持 ElementType#TYPE、ElementType#METHOD、ElementType#PARAMETER
@Valid 和 @Validated 的区别

已校验、有效、校验器.Validator


Bean Validation 2.0(JSR 380)定义了用于实体和方法校验的元数据模型和 API,Hibernate Validator 是目前最佳的实现
Validator 接口有三个方法可用于校验整个实体或仅校验实体的单个属性
•Validator#validate() 校验所有 Bean 上的所有约束
•Validator#validateProperty() 校验单个属性
•Validator#validateValue() 检查给定类的单个属性是否可以成功校验
无论是 requestBody 参数校验还是方法级校验,最终都是调用 Hibernate Validator 来执行校验,Spring Validation 只是做了一层封装。
校验用户输入是我们大多数应用中的常见功能。在 Java 生态系统中,我们专门使用 Java 标准 Bean 校验 API 来支持这一点。此外,从 4.0 版本开始,这也与 Spring 很好地集成在一起。
在接下来的章节中,让我们详细了解它们。

@Valid 和 @Validated 注解
在 Spring 中,我们使用 JSR-303 的 @Valid 注解进行方法级校验。此外,我们还用它来标记需要校验的成员属性。但是,此注解不支持分组校验。
分组有助于限制校验期间应用的约束。一个特殊的用例是 UI 向导。在这里,在第一步中,我们可能有一些字段子集。在后续步骤中,可能有属于同一 Bean 的另一组。因此我们需要在每一步对这些有限的字段应用约束,但 @Valid 不支持这一点。
在这种情况下,对于分组级别,我们必须使用 Spring 的 @Validated,它是 JSR-303 的 @Valid 的变体。这用于方法级。对于标记成员属性,我们继续使用 @Valid 注解。
现在,让我们直接跳进去看看这些注解的用法示例。



3. 示例


让我们考虑一个用 Spring Boot 开发的简单用户注册。首先,我们只有名字和密码属性:

在确认测试成功运行后,我们现在扩展功能。下一个逻辑步骤是将其转换为复杂用户注册。对于第一步,名字和密码保持不变。在第二步中,我们将获得年龄和手机等附加信息。因此我们将用这些附加字段更新我们的领域对象:

然而,这次我们会注意到之前的测试失败了。这是因为我们没有传入年龄和手机字段。为了支持这种行为,我们需要分组校验和 @Validated 注解。

为此,我们需要对字段进行分组,创建两个不同的组。首先,我们需要创建两个标记接口。每个组或每个步骤一个。我们可以参考我们关于分组校验的文章来了解它是如何实现的。在这里,让我们关注注解的差异。
我们将有 BasicInfo 接口用于第一步,AdvanceInfo 用于第二步。此外,我们将更新 UserAccount 类以使用这些标记接口如下:
接下来,让我们看看 @Valid 如何触发嵌套属性的校验。

已校验、有效、校验器.使用 @Valid 嵌套校验


@Valid 注解用于校验嵌套属性。这会触发嵌套对象的校验。例如,在我们当前的场景中,让我们创建一个 UserAddress 对象:
5. 结合 @Valid 和 @Validated 执行集合校验
如果请求体直接将 json 数组传递给后端,并且您想对数组中的每一项进行参数校验。此时,如果我们直接使用 java.util.Collection 下的 list 或 set 来接收数据,参数校验将不会生效!我们可以使用自定义的 list 集合来接收参数:
•包装 List 类型并声明 @Valid 注解
package com.devicemag.core.BO;

import javax.validation.Valid ; _
import java.util .*;

已校验、有效、校验器结论

已校验、有效、校验器.总之,对于任何基础校验,我们将在方法调用上使用 JSR @Valid 注解。另一方面,对于任何分组校验,包括分组序列,我们需要在方法调用中使用 Spring 的 @Validated 注解。@Valid 注解也需要用于触发嵌套属性的校验。
Validated 仍然是 AOP。在方法校验中,使用 AOP 动态拦截方法,并使用 JSR303 Validator 完成校验。在 Bean 的属性校验中,它基于 Bean 的生命周期,在其初始化前后完成校验。
phone 联系我们
你好,我是AI助理。
可以解答问题、推荐解决方案等。