我有以下用于验证密码的类。
第一个
为类中的字段添加@ValidPassword注解是有效的,但是当我尝试将注解添加到函数中的参数时,验证器永远不会被调用/到达。
public void resetUserPassword(Integer userId, @ValidPassword String newPassword) {
}
在此处添加注解也不起作用:
@PostMapping("/user/resetPassword/{id}")
public ResponseEntity<?> resetUserPassword(@PathVariable("userId") Integer userId, @Valid @ValidPassword @RequestBody String newPassword) {
userService.resetUserPassword(userId, newPassword)
return ResponseEntity.ok().build();
}
我不认为我遗漏了任何依赖项,所以我不确定问题出在哪里。
2条答案
按热度按时间c0vxltue1#
在类级注解中定义的注解**@Validated**是开始特定Bean的方法验证所必需的。
也就是说
@Validated注解是一个类级别的注解,我们可以使用它来告诉Spring验证传递到被注解类的方法中的参数。
请参考此链接https://github.com/spring-projects/spring-framework/issues/11039以查找
@Validated
的来源用法:
由于您有以下方法,您的自定义注解
@ValidPassword
与您的@Valid
@有效
它用于启用整个对象验证,正如您在下面的示例中所看到的,将调用
@NotNull
@Size
和@NotBlank
来验证对象中存在的用户输入或提供的值。例如:
@已验证
但是,根据您的情况,您希望在方法参数上调用自定义验证,因此您需要向spring提供提示以调用自定义验证。因此,要做到这一点,您必须在控制器中的类级别声明
@Validated
注解。因此,这些就是在使用
@Validated
注解对控制器类进行注解后,验证开始工作的原因。cbjzeqam2#
您需要在控制器类或另一个类上添加
@Validated
注解,在这些类中您希望使用自定义验证来验证方法参数。在spring-boot 2.1.x documentation中有关于这种方法级验证的解释,但是我在当前的2.7.x文档中找不到它。
一般来说,这是一个spring框架特性,可以在这里找到。在一个非引导项目中,你需要手动创建一个类型为
MethodValidationPostProcessor
的bean,但是spring-boot会自动配置这个bean--自动配置可以在ValidationAutoConfiguration
类中找到。According to java-docs of
MethodValidationPostProcessor
,* 具有JSR-303约束注解方法的目标类需要在类型级别使用Spring的@Validated
注解进行注解,以便在其方法中搜索内联约束注解。也可以通过@Validated
指定验证组。默认情况下,JSR-303将仅根据其默认组进行验证。*