【发布时间】:2018-07-20 13:55:55
【问题描述】:
我正在使用 WebFlux 的功能端点。我使用 onErrorResume 将服务层发送的异常转换为 HTTP 错误代码:
public Mono<String> serviceReturningMonoError() {
return Mono.error(new RuntimeException("error"));
}
public Mono<ServerResponse> handler(ServerRequest request) {
return serviceReturningMonoError().flatMap(e -> ok().syncBody(e))
.onErrorResume( e -> badRequest(e.getMessage()));
}
只要服务返回 Mono,它就可以正常工作。如果服务返回 Flux,我该怎么办?
public Flux<String> serviceReturningFluxError() {
return Flux.error(new RuntimeException("error"));
}
public Mono<ServerResponse> handler(ServerRequest request) {
???
}
编辑
我尝试了以下方法,但不幸的是它不起作用。 Flux.error 不由onErrorResume 处理并传播到框架。在 http 响应序列化过程中,当异常被拆箱时,Spring Boot 异常管理会捕获它并将其转换为 500。
public Mono<ServerResponse> myHandler(ServerRequest request) {
return ok().contentType(APPLICATION_JSON).body( serviceReturningFluxError(), String.class)
.onErrorResume( exception -> badRequest().build());
}
我实际上对这种行为感到惊讶,这是一个错误吗?
【问题讨论】:
标签: spring spring-boot project-reactor spring-webflux