我使用 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()
运算符的使用也无法正常工作。