Abaixo está o trecho de código; basicamente, estou tentando propagar a exceção quando o código de erro é diferente de 200.
ResponseEntity<Object> response = restTemplate.exchange(url.toString().replace("{version}", version),
HttpMethod.POST, entity, Object.class);
if(response.getStatusCode().value()!= 200){
logger.debug("Encountered Error while Calling API");
throw new ApplicationException();
}
No entanto, no caso de uma resposta 500 do servidor, estou recebendo a exceção
org.springframework.web.client.HttpServerErrorException: 500 Internal Server Error
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:94) ~[spring-web-4.2.3.RELEASE.jar:4.2.3.RELEASE]
Eu realmente preciso envolver o método de troca de modelo restante na tentativa? Qual seria então o propósito dos códigos?
spring
rest
exception-handling
resttemplate
Vaibhav
fonte
fonte
Respostas:
Você deseja criar uma classe que implemente
ResponseErrorHandler
e, em seguida, use uma instância dela para definir o tratamento de erros do seu modelo rest:Além disso, o Spring tem a classe
DefaultResponseErrorHandler
, que você pode estender em vez de implementar a interface, caso queira apenas substituir ohandleError
método.Dê uma olhada em seu código-fonte para ter uma ideia de como o Spring trata os erros HTTP.
fonte
ResourceAccessException
porqueRestTemplate.doExecute
pegaIOException
s e lança aResourceAccessException
. O que estou fazendo de errado?Você deve pegar uma
HttpStatusCodeException
exceção:fonte
O Spring trata habilmente os códigos de erro http como exceções e assume que o seu código de tratamento de exceção tem o contexto para tratar o erro. Para que o Exchange funcione como você espera, faça o seguinte:
Isso retornará todos os resultados esperados da resposta.
fonte
Outra solução é a descrita aqui no final desta postagem por "enlian": http://springinpractice.com/2013/10/07/handling-json-error-object-responses-with-springs-resttemplate
fonte
O Spring o abstrai da lista muito grande de códigos de status http. Essa é a ideia das exceções. Dê uma olhada na hierarquia org.springframework.web.client.RestClientException:
Você tem um monte de classes para mapear as situações mais comuns ao lidar com respostas http. A lista de códigos http é muito grande, você não vai querer escrever código para lidar com cada situação. Mas, por exemplo, dê uma olhada na sub-hierarquia HttpClientErrorException. Você tem uma única exceção para mapear qualquer tipo de erro 4xx. Se você precisa ir fundo, você pode. Mas, apenas capturando HttpClientErrorException, você pode lidar com qualquer situação em que dados inválidos tenham sido fornecidos ao serviço.
O DefaultResponseErrorHandler é realmente simples e sólido. Se o código de status de resposta não for da família 2xx, ele apenas retornará verdadeiro para o método hasError.
fonte
Se você usar o mecanismo de pooling (http client factory) ou load balancing (eureka)
RestTemplate
, não terá o luxo de criar umnew RestTemplate
por classe. Se você estiver ligando para mais de um serviço, não poderá usarsetErrorHandler
porque ele será usado globalmente para todas as suas solicitações.Nesse caso, pegar o
HttpStatusCodeException
parece ser a melhor opção.A única outra opção que você tem é definir várias
RestTemplate
instâncias usando a@Qualifier
anotação.Além disso - mas este é o meu gosto - gosto de meu tratamento de erros aninhado às minhas chamadas.
fonte
Eu tratei disso como a seguir:
fonte
O código de troca está abaixo :
Exceção
RestClientException
temHttpClientErrorException
eHttpStatusCodeException
exceção.Assim, em
RestTemplete
que pode occureHttpClientErrorException
eHttpStatusCodeException
exceção. No objeto de exceção, você pode obter a mensagem de erro exata da seguinte maneira:exception.getResponseBodyAsString()
Aqui está o código de exemplo :
Aqui está a descrição do código :
Neste método, você deve passar a classe de solicitação e resposta. Este método analisará automaticamente a resposta como objeto solicitado.
Primeiro de tudo você tem que adicionar conversor de mensagem.
Então você tem que adicionar
requestHeader
. Aqui está o código:Finalmente, você deve chamar o método de troca:
Para impressão bonita, usei a biblioteca Gson. aqui está o gradle:
compile 'com.google.code.gson:gson:2.4'
Você pode apenas chamar o código abaixo para obter a resposta:
Aqui está o código de trabalho completo :
Obrigado :)
fonte
Uma solução muito simples pode ser:
fonte
Aqui está meu método POST com HTTPS, que retorna um corpo de resposta para qualquer tipo de resposta incorreta.
fonte