为Spring Web Client添加异常处理程序

Pet*_*zov 8 spring spring-webflux

我将此代码用于REST API请求.

WebClient.Builder builder = WebClient.builder().baseUrl(gatewayUrl);
ClientHttpConnector httpConnector = new ReactorClientHttpConnector(opt -> opt.sslContext(sslContext));
builder.clientConnector(httpConnector);
Run Code Online (Sandbox Code Playgroud)

我如何添加连接异常处理程序?我想实现一些自定义逻辑?这个功能易于实现吗?

Dov*_*vmo 9

如果我在因SSL凭据而导致连接失败的情况下理解您的问题,那么您应该在REST响应上看到连接异常清单本身.您可以通过Flux您获得的结果处理该异常WebClient.ResponseSpec#onStatus.文档#onStatus说:

注册在给定谓词适用时调用 的自定义错误函数HttpStatus.从函数返回的异常将从bodyToMono(Class)和返回bodyToFlux(Class).默认情况下,错误处理程序是一个寄存器,WebClientResponseException在响应状态代码为4xx5xx时抛出 .

看看这个例子:

Mono<Person> result = client.get()
            .uri("/persons/{id}", id).accept(MediaType.APPLICATION_JSON)
            .retrieve()
            .onStatus(HttpStatus::is4xxServerError, response -> ...) // This is in the docs there but is wrong/fatfingered, should be is4xxClientError
            .onStatus(HttpStatus::is5xxServerError, response -> ...)
            .bodyToMono(Person.class);
Run Code Online (Sandbox Code Playgroud)

类似地,对于您的问题,连接错误应该在调用完成后显示,并且您可以自定义它在响应管道中的传播方式:

Mono<Person> result = client.get()
            .uri("/persons/{id}", id).accept(MediaType.APPLICATION_JSON)
            .retrieve()
            .onStatus(HttpStatus::is4xxClientError, response -> {
                 ... Code that looks at the response more closely...
                 return Mono.error(new MyCustomConnectionException());
             })
            .bodyToMono(Person.class);
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.

  • 我们如何在这里也记录响应?以及异常? (4认同)