Вы можете использовать filterWhen
, но вам нужно будет отменить существующие проверки. Идея состоит в том, чтобы user
передать filter
, когда не существует и, следовательно, может быть создано :
//start from the user itself
Mono.just(user)
//check if it exists, and if so fail the filter => empty mono
.filterWhen(u -> emailExists(u.getEmail()).map(exist -> !exist))
//on an empty Mono at this point, we know it's a duplicate email
.switchIfEmpty(Mono.error(new EmailExistsException(
"There is an account with that email address: " + user.getEmail() )))
//now check if username exists, and similarly fail the filter
.filterWhen(u -> userNameExists(u.getUsername()).map(exist -> !exist))
//if empty at this point we know it's a duplicate username
.switchIfEmpty(Mono.error(new UsernameExistsException(
"There is an account with that username: " + user.getUsername() )))
//otherwise it's not empty and it means that User can be saved
.flatMap(userRepository::save)