如何解决具有switchIfEmpty的Mono <Optional <Object >>
在以下实现中,期望的是,如果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()))
...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。