web-dev-qa-db-fra.com

Ajouter un gestionnaire d'exceptions pour Spring Web Client

J'utilise ce code pour REST requêtes API.

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

Comment puis-je ajouter un gestionnaire d'exceptions de connexion? Je voudrais implémenter une logique personnalisée? Cette fonctionnalité est-elle facile à mettre en œuvre?

11
Peter Penzov

Si je comprends votre question dans le contexte de l'échec de la connexion en raison des informations d'identification SSL, vous devriez voir l'exception de connexion se manifester sur la réponse REST. Vous pouvez prendre soin de cette exception via le Flux résultat que vous obtenez WebClient.ResponseSpec#onStatus . Les documents pour #onStatus disent:

Enregistrez une fonction d'erreur personnalisée qui est invoquée lorsque le prédicat HttpStatus donné s'applique. L'exception renvoyée par la fonction sera renvoyée par bodyToMono(Class) et bodyToFlux(Class). Par défaut, un gestionnaire d'erreurs est un registre qui génère un WebClientResponseException lorsque le code d'état de la réponse est 4xx ou 5xx .

Jetez un oeil à cet exemple :

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

De même pour votre question, l'erreur de connexion devrait se manifester après l'appel et vous pouvez personnaliser la façon dont elle se propage dans le pipeline réactif:

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

J'espère que cela pourra aider.

7
Dovmo