In my restful webservice, in case of bad request (5xx) or 4xx respose codes, I write a custom header "x-app-err-id" to the response.
On the client side, I use exchange method of RestTemplate to make a RestFul web service call. Everything is fine when the response code is 2xx.
ResponseEntity<Component> response = restTemplate.exchange(webSvcURL, HttpMethod.POST, requestEntity, Component.class);
But if there is an exception(HttpStatusCodeException) because of it being a bad request(5xx) or 4xx, in the catch block of HttpStatusCodeException, I get response(see above) as null and so I do not have access to my custom header I set in my web service. How do I get custom headers from the response in case of exceptions in RestTemplate.
One more question is, I set an error object(json) in the reponse body in case of error and I would like to know how to access response body as well in case of exceptions in RestTemplate
I finally did it using ResponseErrorHandler.
public class CustomResponseErrorHandler implements ResponseErrorHandler { private static ILogger logger = Logger.getLogger(CustomResponseErrorHandler.class); private ResponseErrorHandler errorHandler = new DefaultResponseErrorHandler(); public void handleError(ClientHttpResponse response) throws IOException { List<String> customHeader = response.getHeaders().get("x-app-err-id"); String svcErrorMessageID = ""; if (customHeader != null) { svcErrorMessageID = customHeader.get(0); } try { errorHandler.handleError(response); } catch (RestClientException scx) { throw new CustomException(scx.getMessage(), scx, svcErrorMessageID); } } public boolean hasError(ClientHttpResponse response) throws IOException { return errorHandler.hasError(response); } }
And then use this custom response handler for RestTemplate by configuring as shown below
<bean id="restTemplate" class="org.springframework.web.client.RestTemplate"> <property name="messageConverters"> <list> <ref bean="jsonConverter" /> </list> </property> <property name="errorHandler" ref="customErrorHandler" /> </bean> <bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> <property name="supportedMediaTypes" value="application/json" /> </bean> <bean id="customErrorHandler " class="my.package.CustomResponseErrorHandler"> </bean>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With