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!

Estender ResponseEntityExceptionHandler na sua classe não seria uma opção?

Nunca utilizei esta forma que você está implementando.

Caro @Jonathan_Medeiros,

Para você resolveu?


Imagino que esteja falando de herdar de ResponseEntityExceptionHandler na classe LoginErrorHandler?

Justamente isso, pra mim pelo menos sempre atendeu!

Entendo. Você teria algum exemplo? Estendendo ResponseEntityExceptionHandler apenas não consegui entender muito bem.

[]'s!

Bom dia try catch seria uma ótima opção por ele capturaria a exception e nela retornaria o request do jeito que você queira.

Bom dia, caro @Guiabcti.

O problema é usar o “catch” para controlar fluxo de código. Claro que, se eu não conseguir uma solução que atenda melhor ao que eu preciso, irei partir (bem talvez) para essa solução. Mas por agora…

Atualizando:
É possível “contornar” dessa forma:

 //Disparando Request
        try {
            return restTemplate.postForEntity(url, request, String.class);
        } catch (HttpClientErrorException e) {
            errorCode = e.getRawStatusCode();
        }
        switch (errorCode){
            case 401:
                return new ResponseEntity(HttpStatus.UNAUTHORIZED);
        }
        return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR);
    }

Mas se perde o body da resposta do servidor. Então, até o momento, não achei solução ideal.

[]'s!

Tenho sim, segue o exemplo abaixo!