问题描述
在以下实现中,期望的是,如果switchIfEmpty
为空,但将运行到Mono<Optional<Item>>
,但不会按预期运行。
public Mono<ServerResponse> getItemById(ServerRequest request) {
JwtClaim claim = retrieveClaimFromrequest(request);
String itemId = request.pathVariable("itemId");
Mono<ServerResponse> notFound = ServerResponse.notFound().build();
Mono<Optional<Item>> item = Mono.just(itemRepository.findById(Long.parseLong(itemId)));
return item
.flatMap(retItem -> ServerResponse.ok().contentType(APPLICATION_JSON).bodyValue(retItem))
.switchIfEmpty(notFound);
}
解决方法
您当前解决方案的问题是,{em}总是返回Optional<Item>
并可用,无论是实际内容还是空内容,但实例本身都存在 那里。
最好的方法是使用Mono.justOrEmpty(Optional)
,它以Optional
作为参数,并创建一个空的Mono
或一个包含内容的文本:
Mono<Item> item = Mono.justOrEmpty(itemRepository.findById(Long.parseLong(itemId)));
return item.flatMap(retItem -> ServerResponse.ok().build())
.switchIfEmpty(ServerResponse.notFound().build());
实际上,它与使用Mono<Mono<Item>>
的结果来平铺Optional::orElse
一样:
Mono<Optional<Item>> item = Mono.just(itemRepository.findById(Long.parseLong(itemId)));
return item.flatMap(opt -> opt.map(Mono::just).orElse(Mono.empty()))
...