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

18

我使用这段代码进行REST API请求。

WebClient.Builder builder = WebClient.builder().baseUrl(gatewayUrl);
ClientHttpConnector httpConnector = new ReactorClientHttpConnector(opt -> opt.sslContext(sslContext));
builder.clientConnector(httpConnector);

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


1个回答

27

如果我理解你的问题是因为SSL凭证失败导致连接失败,那么你应该在REST响应上看到连接异常的表现。

您可以通过WebClient.ResponseSpec#onStatus获得的Flux 结果来处理该异常。 #onStatus文档表示:

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

请参考此示例

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);

同样地,就您的问题而言,在调用完成后应该会出现连接错误,并且您可以自定义它在反应式管道中如何传播:

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);

希望能对您有所帮助。


4
我们如何在这里记录响应?同时也包括异常? - Rocky4Ever
@Rocky4Ever,我认为你需要使用.exchange()或者替换.retrieve(),或者实现一个全局错误处理程序来捕获异常并记录它们,如果需要的话再重新抛出它们。 - Hamid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接