将RestTemplate与StreamingResponseBody一起使用时出现MessageConverter问题

时间:2020-08-25 07:03:46

标签: spring-boot streaming resttemplate octetstring http-message-converter

我们有一个使用Spring Boot实现的REST API(服务器端)。该API正在以StreamingResponseBody的形式封装在ResponseEntity中的PDF文件流式传输,其中内容类型为MediaType.APPLICATION_OCTET_STREAM

我正试图在RestTemplate的帮助下从客户端应用程序访问此API。该客户端应用程序还是Spring Boot应用程序。该客户端应用程序已存在,并且到目前为止,它已通过两种支持的媒体类型支持MappingJackson2HttpMessageConverter

application/jsonapplication/x-www-form-urlencoded

我遵循了一些建议,并尝试了这些项目

  1. MediaType.APPLICATION_OCTET_STREAM添加到现有的 MappingJackson2HttpMessageConverter
  2. 添加了ByteArrayHttpMessageConverter,默认支持MediaType.APPLICATION_OCTET_STREAM
  3. 添加了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]

使用当前实现更新问题: 这就是我正在创建的resttemplate bean。

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

0 个答案:

没有答案