Я пытаюсь написать собственный 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 неблокирующим способом?