Spring MVC 将自定义验证注解应用于参数

k4aesqcs  于 2022-11-14  发布在  Spring
关注(0)|答案(2)|浏览(167)

我有以下用于验证密码的类。
第一个
为类中的字段添加@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();
}

我不认为我遗漏了任何依赖项,所以我不确定问题出在哪里。

c0vxltue

c0vxltue1#

在类级注解中定义的注解**@Validated**是开始特定Bean的方法验证所必需的。
也就是说

@Validated注解是一个类级别的注解,我们可以使用它来告诉Spring验证传递到被注解类的方法中的参数。

请参考此链接https://github.com/spring-projects/spring-framework/issues/11039以查找@Validated的来源

用法:

由于您有以下方法,您的自定义注解@ValidPassword与您的@Valid

@PostMapping("/user/resetPassword/{id}")
public ResponseEntity<?> resetUserPassword(@PathVariable("userId") Integer userId, @Valid @ValidPassword @RequestBody String newPassword) {
    userService.resetUserPassword(userId, newPassword)
    return ResponseEntity.ok().build();
}

@有效

它用于启用整个对象验证,正如您在下面的示例中所看到的,将调用@NotNull@Size@NotBlank来验证对象中存在的用户输入或提供的值。
例如:

public class DummyUser{
    
    @NotNull
    @Size(min =8)
    private String password;
 
    @NotBlank
    private String username;
}

@已验证

但是,根据您的情况,您希望在方法参数上调用自定义验证,因此您需要向spring提供提示以调用自定义验证。因此,要做到这一点,您必须在控制器中的类级别声明@Validated注解。
因此,这些就是在使用@Validated注解对控制器类进行注解后,验证开始工作的原因。

cbjzeqam

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将仅根据其默认组进行验证。*

相关问题