У меня есть приложение Spring, выполняющее роль прохода от одного приложения к другому, отправляющее запрос http и возвращающее результат вызывающей стороне с помощью WebClient
. Если клиентский HTTP-вызов возвращает внутреннюю ошибку сервера 500, я хочу иметь возможность отловить эту ошибку и обновить возвращаемый объект, а не повторно выдавать ошибку или взрывать приложение.
Это мой клиент:
final TcpClient tcpClient = TcpClient.create()
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, connectionTimeout)
.doOnConnected(connection -> connection.addHandlerLast(new ReadTimeoutHandler(readTimeout))
.addHandlerLast(new WriteTimeoutHandler(writeTimeout)));
this.webClient = WebClient.builder()
.clientConnector(new ReactorClientHttpConnector(HttpClient.from(tcpClient)))
.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.filter(logRequest())
.filter(logResponse())
.filter(errorHandler())
.build();
А это мой обработчик ошибок. Я прокомментировал, где я хочу изменить результат, где ResponseDto
- это пользовательский объект, который возвращается из клиентского вызова happy path
public static ExchangeFilterFunction errorHandler(){
return ExchangeFilterFunction.ofResponseProcessor(clientResponse -> {
ResponseDto resp = new ResponseDto();
if(nonNull(clientResponse.statusCode()) && clientResponse.statusCode().is5xxServerError()){
//this is where I want to modify the response
resp.setError("This is the error");
}
//not necessarily the correct return type here
return Mono.just(clientResponse);
});
}
Как мне этого добиться? Я не могу найти учебники или какую-либо информацию в документах, чтобы помочь объяснить это.
Отказ от ответственности, я новичок в webflux. Мы только начинаем смотреть на реактивное программирование