Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use RestTemplate with application/octet-stream response type

I am using a ISBNdB to get info about the books.The reponse type is application/octet-stream. A sample json response I get looks as follows

{
"index_searched" : "isbn",
"data" : [
  {
     "publisher_id" : "john_wiley_sons_inc",
     "publisher_name" : "John Wiley & Sons, Inc",
     "title_latin" : "Java programming interviews exposed",
     "language" : "eng",
     "summary" : "",
     "physical_description_text" : "1 online resource (xvi, 368 pages) :",
     "author_data" : [
        {
           "name" : "Markham, Noel",
           "id" : "markham_noel"
        },
        {
           "id" : "greg_milette",
           "name" : "Greg Milette"
        }
     ],
     "title_long" : "Java programming interviews exposed",
     "urls_text" : "",
     "publisher_text" : "New York; John Wiley & Sons, Inc",
     "book_id" : "java_programming_interviews_exposed",
     "awards_text" : "; ",
     "subject_ids" : [],
     "isbn13" : "9781118722862",
     "lcc_number" : "",
     "title" : "Java programming interviews exposed",
     "isbn10" : "1118722868",
     "dewey_decimal" : "005.13/3",
     "edition_info" : "; ",
     "notes" : "\"Wrox programmer to programmer\"--Cover.; Acceso restringido a usuarios UCM = For UCM patrons only.",
     "marc_enc_level" : "",
     "dewey_normal" : "5.133"
  }
  ]
  }

I am using Jackson to convert this reponse. My Pojo looks as follows

@JsonIgnoreProperties(ignoreUnknown = true)

public class value {
    private  String index_searched;
    // Another pojo in different file with ignore properties
    private data[] dat;

    public value(){

    }
    public data[] getDat() {
        return dat;
    }

    public void setDat(data[] dat) {
        this.dat = dat;
    }
    public String getIndex_searched() {
        return index_searched;
    }
    public void setIndex_searched(String index_searched) {
        this.index_searched = index_searched;
    } 
   }

When I tried following

  value book = restTemplate.getForObject(FINAL_URL, value.class);

I get this exception

org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [class com.rocketrenga.mylibrary.domain.value] and content type [application/octet-stream]

But I am able to map the response to String

String book = restTemplate.getForObject(FINAL_URL, String.class);
ObjectMapper mapper = new ObjectMapper();
value val = mapper.readValue(book, value.class);
System.out.println(val.getIndex_searched());

How to go about mapping the response directly POJO instead of String and converting back to POJO

like image 255
Rengas Avatar asked Aug 15 '16 12:08

Rengas


People also ask

What is the return type for RestTemplate?

RestTemplate restTemplate = new RestTemplate(); MyObject response = restTemplate. getForObject("xxxxx", MyObject. class, new Object[]{}); the type of response is now MyObject.

Does RestTemplate support all HTTP methods?

Spring RestTemplate class is part of spring-web , introduced in Spring 3. We can use RestTemplate to test HTTP based restful web services, it doesn't support HTTPS protocol. RestTemplate class provides overloaded methods for different HTTP methods, such as GET, POST, PUT, DELETE etc.


2 Answers

You need to conifigure restTemplate with message converters. In your configuration do the following:

   @Bean
    public RestOperations restTemplate() {
        RestTemplate restTemplate = new RestTemplate();
        
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();

        
        converter.setSupportedMediaTypes(
                Arrays.asList(new MediaType[]{MediaType.APPLICATION_JSON, MediaType.APPLICATION_OCTET_STREAM}));

        restTemplate.setMessageConverters(Arrays.asList(converter, new FormHttpMessageConverter()));
        return restTemplate;
    }
like image 155
jny Avatar answered Oct 20 '22 01:10

jny


I guess the better solution is to just add another converter, not to modify current ones:

@Bean
public RestTemplate restTemplate() {
    final RestTemplate restTemplate = new RestTemplate();
    restTemplate.getMessageConverters().add(jacksonSupportsMoreTypes());
    return restTemplate;
}


private HttpMessageConverter jacksonSupportsMoreTypes() {//eg. Gitlab returns JSON as plain text 
    MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
    converter.setSupportedMediaTypes(Arrays.asList(MediaType.parseMediaType("text/plain;charset=utf-8"), MediaType.APPLICATION_OCTET_STREAM));
    return converter;
}
like image 23
Vity Avatar answered Oct 19 '22 23:10

Vity