在Spring Boot上下文中乘以验证器

时间:2017-05-11 11:00:25

标签: java spring validation spring-mvc spring-boot

我试图在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来解决这个误解?

请帮助我让我的代码更清洁一点。 :)

谢谢!

0 个答案:

没有答案