Java 为什么验证Spring控制器请求参数需要@Validated?

Java 为什么验证Spring控制器请求参数需要@Validated?,java,spring,spring-boot,validation,spring-mvc,Java,Spring,Spring Boot,Validation,Spring Mvc,在带注释的MVC控制器中使用以下验证设置: @RestController @请求映射(“/users”) @对象的验证由Hibernate Validator使用Jakarta Bean Validation 2.0中的注释完成。需要一些东西来触发hibernate验证程序运行 SpringMVC在看到带有@Valid的参数时调用控制器方法,并将该对象传递给hibernate验证程序。Hibernate验证程序将 检查对象的类,以确定在类字段上放置了哪些验证规则 对标记有验证注释的字段执行验证

在带注释的MVC控制器中使用以下验证设置:

@RestController
@请求映射(“/users”)

@对象的验证由Hibernate Validator使用Jakarta Bean Validation 2.0中的注释完成。需要一些东西来触发hibernate验证程序运行

SpringMVC在看到带有
@Valid
的参数时调用控制器方法,并将该对象传递给hibernate验证程序。Hibernate验证程序将

  • 检查对象的类,以确定在类字段上放置了哪些验证规则
  • 对标记有验证注释的字段执行验证规则
  • 所以在这种情况下

    @PutMapping(“/{id}/other”)
    public void setOther(@PathVariable long id,@RequestBody@Valid MyFormObject form){
    /* ... */
    } 
    
    MyFormObject
    上有注释,hibernate验证器可以找到这些注释来验证对象

    在这种情况下

    @PutMapping(“/{id}/password”)
    public void setPassword(@PathVariable long id,@RequestBody@Size(min=8)字符串密码){
    /* ... */
    }
    
    java.lang.String上没有为hibernate验证器发现而定义的任何注释

    @Valid
    来自Bean验证包
    javax.validation.Valid
    @Validated
    来自Spring
    org.springframework.validation.annotation.Validated

    @Validated
    注释激活Spring Validation AOP拦截器,它将检查方法参数,看看它们是否有任何验证注释,如果有,Spring将使用每个特定注释调用hibernate validator,例如
    @Size(min=8)字符串密码
    意味着调用hibernate size validator并传递参数密码的值。在这种情况下,hibernate validator不需要扫描
    java.lang.String
    ,以查看其上是否有验证注释
    @Validated
    可用于任何spring
    @组件
    例如,您可以在
    @Service
    类上使用它


    使用
    @Validated
    会有额外的开销,这与使用
    @Transactional
    类似,因此您必须选择使用它。在
    javax.validation.Valid
    Spring MVC需要检查控制器方法参数上的注释,因此当它看到
    @Valid
    时,它可以很容易地将该对象发送到Hibernate验证器,而无需添加AOP拦截器。

    我没有得到的是,没有
    @Validated
    ,Spring中的一些代码检查参数上的
    @Valid
    注释,并通过验证器运行注释的参数。这与查找诸如
    @Size
    (即使用
    @Constraint
    注释的注释)并通过验证器运行它们有什么不同?为什么处理
    @Valid
    的拦截器不能同时处理这两种情况?拦截器可以处理所有spring组件,并且不是spring mvc的一部分。SpringMVC自己寻找@Valid注释