Java 为什么验证Spring控制器请求参数需要@Validated?
在带注释的MVC控制器中使用以下验证设置: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验证程序将 检查对象的类,以确定在类字段上放置了哪些验证规则 对标记有验证注释的字段执行验证
@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
来自Springorg.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注释