我试图在Spring Boot应用程序中使用两种类型的验证。
验证点是:
@PostMapping("/api/register")
@ResponseStatus(value = HttpStatus.CREATED)
public void add(@Valid @RequestBody UserDto userDto) {
log.debug("User registration request: " + userDto.getEmail());
}
UserDto:
public class UserDto {
@NotEmpty
@Email
private String email;
@NotEmpty
@Password
private String password;
@NotEmpty
private String confirmPassword;
@NotEmpty
@Phone
private String phoneNumber;
...
有效。
而且我添加了一个自定义验证器来检查密码匹配并将其声明为Bean:
@Component
public class PasswordMatchesValidator implements Validator {
@Override
public boolean supports(Class<?> aClass) {
return UserDto.class.isAssignableFrom(aClass);
}
@Override
public void validate(Object o, Errors errors) {
UserDto userDto = (UserDto) o;
if (Objects.isNull(userDto.getPassword()))
return;
if (!userDto.getPassword().equals(userDto.getConfirmPassword()))
errors.rejectValue("confirmPassword", "Passwords don't match.", "Passwords don't match.");
}}
非Spring Boot测试环境在解决方案:
之后工作@Autowired
private PasswordMatchesValidator validator;
@InitBinder
private void initBinder(WebDataBinder binder) {
binder.addValidators(validator);
}
但是在Spring Boot应用程序中,Spring用我的PasswordMatchesValidator
bean替换UserDto的所有验证器,其他验证器不起作用!
现在,我已从@Component
删除PasswordMatchesValidator
注释
将控制器代码更改为:
private PasswordMatchesValidator validator =
new PasswordMatchesValidator();
@InitBinder
private void initBinder(WebDataBinder binder) {
binder.addValidators(validator);
}
它是有效的。但我确信可以使用@Component
和@Autowired
注释来连接我的bean,就像在测试环境中一样。
我如何配置Spring来解决这个误解?
请帮助我让我的代码更清洁一点。 :)
谢谢!