Taverna /dev/All

Implementação da Interface ResponseErrorHandler (Spring)

Olá. Estou tentando fazer a sobrescrita da interface ResponseErrorHandler para poder retornar a request inteira (status code, body etc.) em caso de qualquer resposta que não 2xx.

Percebi que o default do Spring (RestTemplate) retorna uma exception em caso de resposta diferente de 2xx. Isso não me ajuda muito.

Seguindo alguns tutoriais, encontrei o seguinte código:

@Component
public class LoginErrorHandler
        implements ResponseErrorHandler {

    @Override
    public boolean hasError(ClientHttpResponse httpResponse)
            throws IOException {

        return (
                httpResponse.getStatusCode().series() == CLIENT_ERROR
                        || httpResponse.getStatusCode().series() == SERVER_ERROR);
    }

    @Override
    public void handleError(ClientHttpResponse httpResponse)
            throws IOException {
        if (httpResponse.getStatusCode()
                .series() == SERVER_ERROR) {
            // handle SERVER_ERROR
        } else if (httpResponse.getStatusCode()
                .series() == CLIENT_ERROR) {
            // handle CLIENT_ERROR
        }
    }

(Referência deste código aqui)

Mas não entendi como vou conseguir retornar um ResponseEntity sem alterar o retorno do método (que não posso por estar fazendo Override).

Implementação:

 //Objeto da requisição
        HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers);
        RestTemplate restTemplate = new RestTemplate();
        restTemplate.setErrorHandler(new LoginErrorHandler());

        //Disparando Request
        return restTemplate.postForEntity(url, request, String.class);

Eu retorno a ResponseEntity completa (assim, ele disponibiliza o body, o status code e tudo mais no endpoint)

Gostaria de saber como vocês fazem. Me falaram “bota tudo dentro de um try/catch e boa”, mas isso me parece gambiarra.

Um abraço!

Pra que você está querendo fazer isto?

Se não me engano, você consegue obter o conteúdo da resposta mesmo quando te retorna um erro diferente. Até por que você precisaria dele pra poder fazer algumas tratativas de acordo com a sua situação.

A ideia do ErrorHandler é justamente te fornecer um ponto de entrada que permita gerenciar este tipo de situação. No httpResposne você deveria conseguir obter o conteúdo (função getBody - https://www.programcreek.com/java-api-examples/?class=org.springframework.http.client.ClientHttpResponse&method=getBody)

Um lugar legal que pode te ajudar é o Spring Brasil - http://www.springbrasil.com.br, já chegou a procurar lá?

Eu estou desenvolvendo uma API que, para fazer login, consulta outra API. Quando eu consigo um (por exemplo) 200, retorno o body da request que eu fiz para o request que fizeram à mim.

Sobre isso eu acho que não, afinal ele tá jogando uma exception quando dá qualquer resposta diferente de 2xx. Não entendo muito bem o por que! Pensei que criando uma variavel do tipo ResponseEntity e recebendo o valor de retorno da request funcionaria, mas não tem como receber o valor da request uma vez que ela joga exception…

Não conhecia! Vou dar uma olhada.

Acho que o Spring Brasil não gostou muito da minha pergunta :sweat_smile:

vou descobrir o que aconteceu.
Esta comunidade é mantida por mim.

Sua dúvida foi postada, nosso índice é que deu um problema e já resolvi. http://springbrasil.com.br/post/show/75

Beleza, Kico. A galera lá é ativa? Postei a pergunta lá, mas não tô conseguindo logar agora.

Depende da época.
Estou querendo animar as coisas por lá.

itexto