首页 > 解决方案 > 反应式存储库返回空 Mono 时如何运行逻辑?

问题描述

我有如下界面,可以在 MongoDB 中通过 phoneNumber 查找实体:

public interface UserRepository extends ReactiveMongoRepository<User, String> {
    
    Mono<User> findByPhoneNumber(String phoneNumber);
}

当 Mono 为空时,此代码正在运行并引发异常,但我不喜欢它。

userRepository.findByPhoneNumber(PHONE_NUMBER)

    .switchIfEmpty(Mono.error(new IllegalArgumentException("user phone number not exist: " + PHONE_NUMBER)))
    .subscribe(result -> {

        // DO LOGIC HERE

    });

我想做这样的事情。我不想抛出异常,因为在 MongoDB 中找不到用户实体是正常的。当 Mono 为空时,我想采用不同的逻辑。

userRepository.findByPhoneNumber(PHONE_NUMBER)

    .switchIfEmpty(() -> {

        // DO OTHER LOGIC HERE when Mono is empty

    })
    .subscribe(result -> {

        // DO LOGIC HERE

    });

标签: javaspringreactive-programmingproject-reactorreactive

解决方案


我认为您可以使用 Spring WebFlux 文档示例获得更好的代码

所以而不是:

userRepository.findByPhoneNumber(PHONE_NUMBER)

    .switchIfEmpty(() -> {

        // DO OTHER LOGIC HERE when Mono is empty

    })
    .subscribe(result -> {

        // DO LOGIC HERE

    });

你会有类似的东西

 public Mono<User> findByPhoneNumber(String phoneNumber) { 
        return repository.findByPhoneNumber(phoneNumber)
            .switchIfEmpty(Throw YOUR_EX());
    }

如果您不想在 Exception 中抛出异常switchIfEmpty,可以尝试 returnin a Mono.Empty

 public Mono<User> findByPhoneNumber(String phoneNumber) { 
        return repository.findByPhoneNumber(phoneNumber)
            .switchIfEmpty(Mono.defer(() -> {
               log.error("No Users found with phoneNumber [{}]", phoneNumber);
               return Mono.empty();
    }));
 }

您也可以在此处获得一些详细信息。


推荐阅读