反应式编程 - 具有默认和异常处理
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) 切换到另一个生产者。
我正在努力寻找使用反应式处理默认和错误的最佳方法。
这是一个工作代码。
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) 切换到另一个生产者。