首页 > 解决方案 > 获取 Mono 的结果以便将其传递到 JpaRepository 或另一个非反应类

问题描述

我想知道从Mono(或Flux)获取对象以传递给非反应性方法(例如JpaRepository.

这是我的做法:

@Service
public class ReactiveAccountService {

    //AccountService's methods take non-mono/non-flux objects as arguments
    private AccountService accountService;

    public ReactiveAccountService(AccountService accountService) {
        this.accountService = accountService;
    }

    public Mono<Void> signUp(Mono<Account> accountMono) {
        //Account is a Jpa entity
        accountMono.subscribe(account -> accountService.signUp(account));
        return Mono.empty();
    }

}

如何改进?有人可以建议吗?

标签: springspring-data-jpaproject-reactor

解决方案


更好的方法是这样的:

public Mono<Void> signUp(Mono<Account> accountMono) {
    //Account is a Jpa entity
    return accountMono.flatMap(account -> {
                  accountService.signUp(account);
                  return Mono.empty();
              });
}

这样你就可以遵循 Reactive Streams 的要求,并且不会用你的阻塞代码来打扰执行流程。另外,根据 Spring WebFlux 的要求,您无需在自己的代码中订阅,而是将所有内容都交给容器,该容器是Mono<Account>. 当 Web (Reactive) 容器中有足够的资源订阅返回的Mono.


推荐阅读