Friday, June 2, 2017

RestClientException: Could not extract response. no suitable HttpMessageConverter found

Leave a Comment

Using the curl command:

curl -u 591bf65f50057469f10b5fd9:0cf17f9b03d056ds0e11e48497e506a2 https://backend.tdk.com/api/devicetypes/59147fd79e93s12e61499ffe/messages 

I an getting a JSON response:

{"data":[{"device":"18SE62","time":1494516023,"data":"3235","snr":"36.72",... 

I save the response on a txt file and parse it using jackson, and everything is fine

ObjectMapper mapper = new ObjectMapper();         File f = new File(getClass().getResource                     ("/result.json").getFile());         MessageList messageList = mapper.readValue(f, MessageList.class); 

and I asume I should get the same result using RestTemplate but It is not the case

RestTemplate restTemplate = new RestTemplate();         MessageList messageList =                  restTemplate.getForObject("http://592693f43c87815f9b8145e9:f099c85d84d4e325a2186c02bd0caeef@backend.tdk.com/api/devicetypes/591570373c87894b4eece34d/messages", MessageList.class); 

I got an error instead

Exception in thread "main" org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [class com.tdk.domain.backend.MessageList] and content type [text/html;charset=iso-8859-1]     at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:109)     at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:655)     at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:613)     at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:287)     at com.tdk.controllers.restful.client.RestTemplateExample.main(RestTemplateExample.java:27) 

I tried to set the content Type:

HttpHeaders headers = new HttpHeaders();         headers.setContentType(MediaType.APPLICATION_JSON);         HttpEntity<String> entity = new HttpEntity<String>("parameters", headers);           MessageList messageList =                  restTemplate.getForObject(url, entity, MessageList.class); 

but then I got a compilation error

The method getForObject(String, Class<T>, Object...) in the type RestTemplate is not applicable for the arguments (String, HttpEntity<String>,   Class<MessageList>) 

I also tried to add a the Jackson Message converter

  List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();                     //Add the Jackson Message converter             messageConverters.add(new MappingJackson2HttpMessageConverter());                 //Add the message converters to the restTemplate             restTemplate.setMessageConverters(messageConverters);               MessageList messageList =                      restTemplate.getForObject(url, MessageList.class); 

But then I got this error:

Exception in thread "main" org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [class com.tdk.domain.backend.MessageList] and content type [text/html;charset=iso-8859-1]     at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:109)     at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:655)     at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:613)     at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:287)     at com.tdk.controllers.restful.client.RestTemplateExample.main(RestTemplateExample.java:51) 

I also tried adding the class

@Configuration @EnableWebMvc public class MvcConf extends WebMvcConfigurationSupport {      protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {         converters.add(converter());         addDefaultHttpMessageConverters(converters);     }      @Bean     MappingJackson2HttpMessageConverter converter() {          MappingJackson2HttpMessageConverter converter                      = new MappingJackson2HttpMessageConverter();         return converter;     }  } 

but I got the error:

org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [class com.tdk.domain.backend.MessageList] and content type [text/html;charset=iso-8859-1]     at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:109)     at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:655)     at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:613)     at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:287) 

1 Answers

Answers 1

The main problem here is content type [text/html;charset=iso-8859-1] received from the service, however the real content type should be application/json;charset=iso-8859-1

In order to overcome this you can introduce custom message converter. and register it for all kind of responses (i.e. ignore the response content type header). Just like this

  List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();                     //Add the Jackson Message converter    MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();    // Note: here we are making this converter to process any kind of response,     // not only application/*json, which is the default behaviour    converter.setSupportedMediaTypes(Arrays.asList({MediaType.ALL}));             messageConverters.add(converter);      restTemplate.setMessageConverters(messageConverters);   
If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment