1
resposta

Tratando a exceção no whenComplete do CompletableFuture

Na classe PlanetaDAO, caso o serviço esteja fora, eu fiz o seguinte para dar um retorno:

    public void listar() throws URISyntaxException, IOException, InterruptedException {
        HttpClient httpClient = HttpClient.newBuilder().build();

        httpClient.sendAsync(HttpRequest.newBuilder().uri(new URI("http://localhost:8080/planetas")).GET().build(),
                BodyHandlers.ofString()).whenComplete((s, t) -> {
                    if (t != null) {
                        System.out.println("Serviço Indisponível");
                    } else {
                        System.out.println(s.body());
                    }
                });
    }

Existe alguma maneira de fazer de forma mais sucinta, ou em uma linha ?

1 resposta

Olá George! Tudo certo?

Desculpa pela demora em obter retorno.

É possível fazer de forma mais sucinta utilizando o método exceptionally() do CompletableFuture. Ele é chamado quando ocorre uma exceção durante a execução do CompletableFuture. O código ficaria mais ou menos assim:

public void listar() throws URISyntaxException, IOException, InterruptedException {
    HttpClient httpClient = HttpClient.newBuilder().build();

    httpClient.sendAsync(HttpRequest.newBuilder().uri(new URI("http://localhost:8080/planetas")).GET().build(),
            BodyHandlers.ofString())
            .thenApply(HttpResponse::body)
            .exceptionally(t -> "Serviço Indisponível")
            .thenAccept(System.out::println);
}

Neste código, o método thenApply() é utilizado para extrair o corpo da resposta do serviço. Em seguida, o método exceptionally() é utilizado para tratar a exceção, retornando a mensagem "Serviço Indisponível". Por fim, o método thenAccept() é utilizado para imprimir o resultado na saída padrão. Uma observação é que enxugamos o código, mas acaba dando pouca diferença de um para o outro.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!