Spring Reactor:如何在发布者发出值时抛出异常?

问题描述 投票:0回答:1

我正在学习使用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,我怎样才能实现这个要求?

谢谢

if-statement exception switch-statement project-reactor
1个回答
1
投票

要在发布者发出值时传播异常,您可以使用对发出值进行操作的多个运算符之一。

一些例子:

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()))
© www.soinside.com 2019 - 2024. All rights reserved.