我对Project Reactor或()运算符的使用存在问题

时间:2019-09-06 14:54:06

标签: reactive-programming project-reactor

我使用 Project Reactor ,并且具有以下反应链:

public Mono<ServerResponse> createUser(ServerRequest serverRequest) {
    return serverRequest
        .bodyToMono(User.class)
        .flatMap(
            user -> validateUser(user)
                .or(validateEmailNotExists(user))
                .or(saveUser(user))
                .single()
        );
}

由于某种原因,最后一个Mono,即saveUser(user)为空,我得到了以下异常:

java.util.NoSuchElementException: Source was empty
    at reactor.core.publisher.MonoSingle$SingleSubscriber.onComplete(MonoSingle.java:165) ~[reactor-core-3.3.0.RC1.jar:3.3.0.RC1]
    Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
Assembly trace from producer [reactor.core.publisher.MonoSingleMono] :
    reactor.core.publisher.Mono.single(Mono.java:3898)
    org.example.contracttestingdemo.handler.UserHandler.lambda$createUser$1(UserHandler.java:54)

这是saveUser方法的代码:

private Mono<ServerResponse> saveUser(User user) {
    return userRepository.save(user)
        .flatMap(newUser -> status(CREATED)
            .contentType(APPLICATION_JSON)
            .body(BodyInserters.fromObject(newUser))
        );
}

这很奇怪,因为在不使用or().single()运算符的情况下,saveUser方法会返回非空结果。

仅供参考,这是存储库:

UserRepository extends ReactiveCrudRepository<User, Long>...

有人可以帮忙吗?

编辑:顺便说一下,如果我使用以下链(请注意,saveUser调用已被更明确和更简单的替换):

public Mono<ServerResponse> createUser(ServerRequest serverRequest) {
    return serverRequest
        .bodyToMono(User.class)
        .flatMap(
            user -> validateUser(user)
                .or(validateEmailNotExists(user))
                .or(status(CREATED).body(BodyInserters.fromObject("something")))
                .single()
        );
}

该问题仍在发生,表明即使返回了非空的Mono,我对or()运算符的使用也无法正常工作。

0 个答案:

没有答案