Spring 传递Webflux Http错误

Spring 传递Webflux Http错误,spring,reactive-programming,project-reactor,Spring,Reactive Programming,Project Reactor,正在努力弄清楚如何接受从响应请求接收到的异常,并将其冒泡出来(正文和Http状态代码将是最低限度的信息) 我希望使用前面提到的ExchangeFilter函数,但似乎无法捕获错误。我知道它已注册并正在通过该方法运行 public class MyExchangeFilterFunction implements ExchangeFilterFunction { @Override public Mono<ClientResponse> filter(ClientRe

正在努力弄清楚如何接受从响应请求接收到的异常,并将其冒泡出来(正文和Http状态代码将是最低限度的信息)

我希望使用前面提到的ExchangeFilter函数,但似乎无法捕获错误。我知道它已注册并正在通过该方法运行

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"));
    }
}
转换为的错误(因为我不知道如何冒泡):

--------更新-------

错误现在与最新的代码一起抛出,但无法找出如何将响应主体阻塞到Flux/Mono错误中

@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;
    }

    });
}
@覆盖
公共Mono筛选器(ClientRequest请求,ExchangeFunction下一步){
返回next.exchange(请求).map(cr->{
if(cr.statusCode().isError()){
返回ClientResponse.from(cr).body(
错误(新运行时异常(“OW”))
).build();
}否则{
返回cr;
}
});
}
更进一步

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)));
return ClientResponse.from(cr)
        .body(cr.body(BodyExtractors.toFlux(AnError.class))
        .flatMap(err -> Flux.error(new PassThroughException(err))))
        .build();
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)));