Pass-Through Webflux Http Ошибка - PullRequest
0 голосов
/ 11 мая 2018

Изо всех сил пытаюсь выяснить, как взять исключение, полученное из реактивного запроса, и просто создать его (тело и Http Status Code были бы минимальной информацией).

Я надеялся использовать ExchangeFilterFunction, как упомянуто здесь но, похоже, ошибка не обнаружена.Я знаю, что он зарегистрирован и работает по методу

public class MyExchangeFilterFunction implements ExchangeFilterFunction {

    @Override
    public Mono<ClientResponse> filter(ClientRequest request, ExchangeFunction next) {
        return next.exchange(request).onErrorMap(MyError.class, c -> new RuntimeException("Ow"));
    }
}

Зарегистрировать функцию фильтра:

WebClient.builder().filter(new MyExchangeFilterFunction())...

Ошибка преобразования в (поскольку я не могу понять, как просто всплыть):

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class MyError extends RuntimeException{
    private Long timestamp;
    private String path;
    private Integer status;
    private String error;
    private String message;
}

-------- Обновление -------

В настоящее время ошибка с последним кодом, но не удается выяснить, какзаклинить тело ответа в сообщение Flux / Mono Error.

@Override
public Mono<ClientResponse> filter(ClientRequest request, ExchangeFunction next) {
    return next.exchange(request).map(cr -> {
    if(cr.statusCode().isError()) {
        return ClientResponse.from(cr).body(
                Flux.error(new RuntimeException("OW"))
                ).build();
    } else {
        return cr;
    }

    });
}

1 Ответ

0 голосов
/ 21 мая 2018

Принимает Реактивная обработка исключений на шаг дальше.

return ClientResponse.from(cr)
        .body(cr.body(BodyExtractors.toFlux(AnError.class))
        .flatMap(err -> Flux.error(new PassThroughException(err))))
        .build();

затем в WebExceptionHandler:

AnError error;
if(ex instanceof PassThroughException) {
    error = ((PassThroughException) ex).getAnError();
} else {
    ...
}

exchange.getResponse().setStatusCode(HttpStatus.resolve(error.getStatus()));
exchange.getResponse().getHeaders().add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_UTF8_VALUE);

byte[] bite = null;
try {
    bite = objectMapper.writeValueAsBytes(error);
} catch (JsonProcessingException jpe) {
    log.error("Unable to write error to client: {}", ex, jpe);
}
return exchange.getResponse().writeWith(Flux.just(exchange.getResponse().bufferFactory().wrap(bite)));
...