Проблема MessageConverter при использовании RestTemplate с StreamingResponseBody
У нас есть REST API (на стороне сервера), реализованный с использованием Spring Boot. Этот API передает файл PDF какStreamingResponseBody
завернут в ResponseEntity
где тип содержимого задается как MediaType.APPLICATION_OCTET_STREAM
.
Я пытаюсь получить доступ к этому API из клиентского приложения с помощью RestTemplate
. Это клиентское приложение снова является приложением Spring Boot. Это клиентское приложение существует, и оно поддерживалоMappingJackson2HttpMessageConverter
с двумя поддерживающими типами СМИ.
application/json
а также application/x-www-form-urlencoded
Я последовал нескольким предложениям и попробовал эти предметы
- Добавлено
MediaType.APPLICATION_OCTET_STREAM
к существующимMappingJackson2HttpMessageConverter
- Добавлено
ByteArrayHttpMessageConverter
который по умолчанию поддерживаетMediaType.APPLICATION_OCTET_STREAM
- Добавлено
ResourceHttpMessageConverter
который поддерживает потоковый ответ.
Но со всеми этими предложениями я столкнулся со следующими ошибками. На данный момент я не совсем уверен, есть ли что-то, чего мне не хватает в конфигурации. Команда, это действительно будет большим подспорьем, если вы сможете перенаправить меня на короткие примеры или решения для достижения этой интеграции.
org.springframework.web.client.RestClientException: Error while extracting response for type [interface org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody] and content type [application/octet-stream]; nested exception is org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Unexpected character ('%' (code 37)): expected a valid value (JSON String, Number, Array, Object or token 'null', 'true' or 'false'); nested exception is com.fasterxml.jackson.core.JsonParseException: Unexpected character ('%' (code 37)): expected a valid value (JSON String, Number, Array, Object or token 'null', 'true' or 'false') at [Source: (PushbackInputStream); line: 1, column: 2]
Эта следующая ошибка была, когда я пытался с ByteArrayHttpMessageConverter
(или) ResourceHttpMessageConverter
org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [interface org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody] and content type [application/octet-stream]
at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:123) ~[spring-web-5.2.6.RELEASE.jar!/:5.2.6.RELEASE]
Обновление вопроса с текущей реализацией: вот как я создаю bean-компонент resttemplate.
@Bean
public RestTemplate restTemplate() {
final RestTemplate restTemplate = new RestTemplate(httpRequestFactory());
final List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
final MappingJackson2HttpMessageConverter converter = new
MappingJackson2HttpMessageConverter();
final List<MediaType> mediaTypes = new ArrayList<>();
mediaTypes.add(MediaType.APPLICATION_JSON);
mediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
//mediaTypes.add(MediaType.APPLICATION_OCTET_STREAM)
converter.setSupportedMediaTypes(mediaTypes);
messageConverters.add(converter);
restTemplate.setMessageConverters(messageConverters);
return restTemplate;
}
И мой клиентский вызов API
ResponseEntity<StreamingResponseBody> response = reportRestTemplate.exchange(builder.buildAndExpand(uriParams).toUriString(),HttpMethod.GET,entity,StreamingResponseBody.class,uriParams);