Я использую функциональные конечные точки WebFlux. Я преобразую исключения, отправленные уровнем сервиса, в код ошибки HTTP, используя onErrorResume
:
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 Exception перехватывает его и преобразует в 500.
public Mono<ServerResponse> myHandler(ServerRequest request) {
return ok().contentType(APPLICATION_JSON).body( serviceReturningFluxError(), String.class)
.onErrorResume( exception -> badRequest().build());
}
Я действительно удивлен поведением, это ошибка?