Spring Reactor: как вызвать исключение, когда издатель выдает значение? - PullRequest
0 голосов
/ 03 апреля 2019

Я изучаю реактивное программирование с помощью Reactor и хочу реализовать сценарий регистрации, в котором у пользователя может быть несколько учетных записей, назначенных одному и тому же профилю. Однако имя пользователя, назначенное профилю, и телефон, назначенный учетной записи, должны быть уникальными.

Как вы можете увидеть в следующем фрагменте, этот сценарий будет легко реализовать, если Reactor предложит оператор switchIfNotEmpty.

public Mono<PersonalAccountResponse> createPersonalAccount(PersonalAccountRequest request) {
    return Mono
            .just(request.isAlreadyUser())
            .flatMap(isAlreadyUser ->  {
                if(isAlreadyUser){
                    return profileDao
                            .findByUsername(request.getUsername()) //
                            .switchIfEmpty(Mono.error(() -> new IllegalArgumentException("...")));
                }else{
                    return profileDao
                            .findByUsername(request.getUsername())
                            .switchIfEmpty(Mono.from(profileDao.save(profileData)))
                            .switchIfNotEmpty(Mono.error(() -> new IllegalArgumentException("...")));
                }
            })
            .map(profileData -> personalAccountMapper.toData(request))
            .flatMap(accountData -> personalAccountDao
                                            .retrieveByMobile(request.getMobileNumber())
                                            .switchIfEmpty(Mono.from(personalAccountDao.save(accountData)))
                                            .switchIfNotEmpty(Mono.error(() -> new IllegalArgumentException("..."))))
            .map(data ->  personalAccountMapper.toResponse(data, request.getUsername()));
}

Как я могу реализовать это требование без switchIfNotEmpty?

Спасибо

1 Ответ

1 голос
/ 04 апреля 2019

Чтобы распространить исключение, когда издатель выдает значение, вы можете использовать один из нескольких операторов, работающих с выдаваемыми значениями.

Некоторые примеры:

fluxOrMono.flatMap(next -> Mono.error(new IllegalArgumentException()))
fluxOrMono.map(next -> { throw new IllegalArgumentException(); })
fluxOrMono.doOnNext(next -> { throw new IllegalArgumentException(); })
fluxOrMono.handle((next, sink) -> sink.error(new IllegalArgumentException()))
...