web-dev-qa-db-ja.com

Spring Webクライアントの例外ハンドラーを追加する

このコードをREST APIリクエストに使用します。

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

接続例外ハンドラを追加するにはどうすればよいですか?カスタムロジックを実装したいですか?この機能は簡単に実装できますか?

11
Peter Penzov

SSL資格情報が原因で接続が失敗する状況での質問を理解した場合、REST応答で接続例外マニフェスト自体が表示されます。この例外はFlux結果の取得 _WebClient.ResponseSpec#onStatus_ 。_#onStatus_のドキュメントは次のように述べています:

指定されたHttpStatus述語が適用されたときに呼び出されるカスタムエラー関数を登録します。関数から返された例外は、bodyToMono(Class)およびbodyToFlux(Class)から返されます。デフォルトでは、エラーハンドラーは、応答ステータスコードが4xxまたは5xxの場合に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);
_

お役に立てば幸いです。

7
Dovmo