java 如何将 RestTemplate 与 application/octet-stream 响应类型一起使用
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/38955167/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to use RestTemplate with application/octet-stream response type
提问by Rengas
I am using a ISBNdBto get info about the books.The reponse type is application/octet-stream. A sample json response I get looks as follows
我正在使用ISBNdB来获取有关书籍的信息。响应类型是应用程序/八位字节流。我得到的示例 json 响应如下所示
{
"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 Hymanson to convert this reponse. My Pojo looks as follows
我正在使用 Hymanson 来转换此响应。我的 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;
}
}
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
如何直接映射响应 POJO 而不是 String 并转换回 POJO
回答by jny
You need to conifigure restTemplate with message converters. In you configuration do the following:
您需要使用消息转换器配置 restTemplate。在您的配置中执行以下操作:
@Bean
public RestOperations restTemplate() {
RestTemplate restTemplate = new RestTemplate();
MappingHymanson2HttpMessageConverter converter = new MappingHymanson2HttpMessageConverter();
converter.setSupportedMediaTypes(
Arrays.asList(new MediaType[]{MediaType.APPLICATION_JSON, MediaType.APPLICATION_OCTET_STREAM}));
restTemplate.setMessageConverters(Arrays.asList(converter, new FormHttpMessageConverter()));
return restTemplate;
}
回答by Vity
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(HymansonSupportsMoreTypes());
return restTemplate;
}
private HttpMessageConverter HymansonSupportsMoreTypes() {//eg. Gitlab returns JSON as plain text
MappingHymanson2HttpMessageConverter converter = new MappingHymanson2HttpMessageConverter();
converter.setSupportedMediaTypes(Arrays.asList(MediaType.parseMediaType("text/plain;charset=utf-8"), MediaType.APPLICATION_OCTET_STREAM));
return converter;
}