2016-08-15 8 views
0

Я использую ISBNdB, чтобы получить информацию о книгах. Тип ответа - это приложение/октет-поток. Образец ответа json, который я получаю, выглядит следующим образом:Как использовать RestTemplate с типом ответа приложения/октета-потока

{ 
"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" 
    } 
    ] 
    } 

Я использую Jackson для преобразования этого ответа. Мой Pojo выглядит следующим образом

@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; 
    } 
    } 

Когда я попытался следующие

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

Я получаю это исключение

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] 

Но я могу отобразить ответ на строки

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()); 

Как перейти к отображению ответа e непосредственно POJO вместо String и преобразование обратно в POJO

+0

то, что приближенное вы пробовали до сих пор, чтобы преобразовать ответ непосредственно в pojo? –

+0

Я уже изложил то, что я пробовал в своем вопросе. Часть, когда я пытался ... – Rengas

+0

Проблема действительно на стороне сервера. Почему вы отправляете JSON с типом контента 'application/octet-stream'? –

ответ

3

Вам необходимо сконфигурировать restTemplate с помощью конвертеров сообщений. В вас конфигурации выполните следующие действия:

@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; 
    } 
3

Я думаю, лучшим решением будет просто добавить еще один конвертер, чтобы не изменять текущие из них:

@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; 
} 
Смежные вопросы