Реактивный валидатор настраиваемых ограничений в Spring webflux - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь написать собственный ConstraintValidator, который выполняет поиск в mongodb с использованием spring-webflux и spring-data reactive mon go.

В традиционной весенней сети mvc можно было бы создать a) аннотацию и b) реализовать настраиваемый ConstraintValidator, затем аннотировать @RequestBody с помощью @Valid, и spring web mvc вызовет валидатор и отклонит запрос с кодом состояния 400, если результат проверки будет ложным.

Однако при использовании того же подхода в spring webflux мне кажется, что я вынужден реализовать настраиваемый валидатор ограничений блокирующим способом, что не соответствует реактивной модели spring webflux. Пример (упрощен для краткости):


public class UserPasswordValidator
    implements ConstraintValidator<ValidUserPassword, UpdateUserPasswordDto> {

  @Resource
  private ReactiveUserRepository reactiveUserRepo;

  @Override
  public boolean isValid(UpdateUserPasswordDto userPasswordDto,
                         ConstraintValidatorContext context) {

    // This is a blocking call. How can this be done in webflux?
    UserEntity user = reactiveUserRepo.findByUuid(userPasswordDto.getUuid()).block();


    if (!oldPasswordIsCorrect(userPasswordDto.getCurrentPassword(), user.getPasswordHash())) {
      context.disableDefaultConstraintViolation();
      context
          .buildConstraintViolationWithTemplate("Incorrect current password")
          .addConstraintViolation();
      return false;
    }

    return true;
  }

}

Есть ли способ выполнить настраиваемую проверку, которая требует поиска в базе данных в Spring webflux неблокирующим способом?

...