環境
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
</parent>
状況
あるREST APIが場合によってContent-Typeがapplication/json
になったりapplication/octet-stream
するが、JSONが返ってくることには変わりはない状況に出くわした。このとき、レスポンスのJavaオブジェクトへのマッピングがapplication/octet-stream
の場合は以下のようにエラーとなる。
org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [class asdf.springsample.SampleController$MyResponse] and content type [application/octet-stream]
対策
デフォルトではspringのConverterがapplication/json
の場合にマッピングするようになっているので、これにapplication/octet-stream
も追加する。参考:Could not extract response: no suitable HttpMessageConverter found for response type
RestTemplate r = new RestTemplate();
MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
mappingJackson2HttpMessageConverter.setSupportedMediaTypes(Arrays.asList(MediaType.APPLICATION_JSON, MediaType.APPLICATION_OCTET_STREAM));
r.getMessageConverters().add(mappingJackson2HttpMessageConverter);
RequestEntity<String> request = RequestEntity.post(new URI("http://localhost:8080/a2")).accept(MediaType.APPLICATION_JSON, MediaType.APPLICATION_OCTET_STREAM).body("");
ResponseEntity<MyResponse> response = r.exchange(request, MyResponse.class);
もしくは、参考URLによると、Apache HttpComponents HttpClientをクラスパスに入れてこっちを使う場合は以下のようなやり方でもOKらしい(こっちは実際に試してない)。
ClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(HttpClients.createDefault());
RestTemplate restTemplate = new RestTemplate(requestFactory);