反应式编程 - 具有默认和异常处理

Reactive programming - With default and exception handling

我正在努力寻找使用反应式处理默认和错误的最佳方法。

这是一个工作代码。

public Mono<ServerResponse> retrieveById(ServerRequest request) {
        final String id = request.pathVariable("ID");
        return context.retrieveUser().flatMap(usr -> {
            return repository.findByApptId(Long.parseLong(id), usr.getOrgId()).flatMap(appt -> {
                return ServerResponse.ok().contentType(APPLICATION_JSON).bodyValue(appt);
            });
        });
    }

我正在尝试添加默认和错误处理。

默认情况下,

return context.retrieveUser().flatMap(usr -> {
            return repository.findByApptId(Long.parseLong(apptId), usr.getOrgId()).flatMap(appt -> {
                return ServerResponse.ok().contentType(APPLICATION_JSON).bodyValue(appt);
            }).defaultIfEmpty(ServerResponse.notFound().build());

以上默认添加报错

The method defaultIfEmpty(ServerResponse) in the type Mono is not applicable for the arguments
(Mono)

onErrorReturn 也出现同样的错误。

Mono#defaultIfEmpty 取一个项目 T 和 return 一个 Mono<T>。这意味着如果你给它一个 String 它会 return 一个 Mono<String>.

你给它 ServerResponse.notFound().build(),其中 return 是一个 Mono<ServerResponse>,它不会工作,因为它会给出 Mono<Mono<ServerResponse>>

您正在寻找的是 Mono#switchIfEmpty 如果前一个生产者为空,它会将生产者 (Mono) 切换到另一个生产者。