具有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()))
           ...