[解決済み】RestClientException: 適切な HttpMessageConverter が見つかりませんでした。
2022-02-22 07:39:49
質問
curlコマンドを使用しています。
curl -u 591bf65f50057469f10b5fd9:0cf17f9b03d056ds0e11e48497e506a2 https://backend.tdk.com/api/devicetypes/59147fd79e93s12e61499ffe/messages
JSONの応答があります。
{"data":[{"device":"18SE62","time":1494516023,"data":"3235","snr":"36.72",...
レスポンスをtxtファイルに保存し、jacksonでパースすると、すべてうまくいきます。
ObjectMapper mapper = new ObjectMapper();
File f = new File(getClass().getResource
("/result.json").getFile());
MessageList messageList = mapper.readValue(f, MessageList.class);
で、RestTemplateを使っても同じ結果になるはずなのですが、そうではありません。
RestTemplate restTemplate = new RestTemplate();
MessageList messageList =
restTemplate.getForObject("http://592693f43c87815f9b8145e9:[email protected]/api/devicetypes/591570373c87894b4eece34d/messages", MessageList.class);
代わりにエラーが発生しました
Exception in thread "main" org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [class com.tdk.domain.backend.MessageList] and content type [text/html;charset=iso-8859-1]
at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:109)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:655)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:613)
at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:287)
at com.tdk.controllers.restful.client.RestTemplateExample.main(RestTemplateExample.java:27)
contentTypeを設定しようとしました。
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> entity = new HttpEntity<String>("parameters", headers);
MessageList messageList =
restTemplate.getForObject(url, entity, MessageList.class);
しかし、コンパイルエラーが発生しました。
The method getForObject(String, Class<T>, Object...) in the type RestTemplate is not applicable for the arguments (String, HttpEntity<String>,
Class<MessageList>)
また、Jackson Messageコンバータを追加してみました。
List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
//Add the Jackson Message converter
messageConverters.add(new MappingJackson2HttpMessageConverter());
//Add the message converters to the restTemplate
restTemplate.setMessageConverters(messageConverters);
MessageList messageList =
restTemplate.getForObject(url, MessageList.class);
と思ったら、こんなエラーが出ました。
Exception in thread "main" org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [class com.tdk.domain.backend.MessageList] and content type [text/html;charset=iso-8859-1]
at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:109)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:655)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:613)
at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:287)
at com.tdk.controllers.restful.client.RestTemplateExample.main(RestTemplateExample.java:51)
また、クラスを追加してみました。
@Configuration
@EnableWebMvc
public class MvcConf extends WebMvcConfigurationSupport {
protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(converter());
addDefaultHttpMessageConverters(converters);
}
@Bean
MappingJackson2HttpMessageConverter converter() {
MappingJackson2HttpMessageConverter converter
= new MappingJackson2HttpMessageConverter();
return converter;
}
}
が、エラーになりました。
org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [class com.tdk.domain.backend.MessageList] and content type [text/html;charset=iso-8859-1]
at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:109)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:655)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:613)
at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:287)
解決方法は?
ここでの主な問題点は コンテンツタイプ [text/html;charset=iso-8859-1] の場合。 を受信しましたが、本当のコンテンツタイプは application/json;charset=iso-8859-1
この問題を解決するには、カスタムメッセージコンバータを導入して、あらゆる種類のレスポンスに対して登録します(つまり、レスポンスのコンテントタイプヘッダーを無視します)。次のようにします。
List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
//Add the Jackson Message converter
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
// Note: here we are making this converter to process any kind of response,
// not only application/*json, which is the default behaviour
converter.setSupportedMediaTypes(Collections.singletonList(MediaType.ALL));
messageConverters.add(converter);
restTemplate.setMessageConverters(messageConverters);
関連
-
[解決済み] Elasticsearchでネストしたオブジェクトを検索する方法
-
[解決済み] JSON Schemaにおける "required "と "optional "の違いについて
-
[解決済み] マニフェスト 行: 1, 列: 1, 構文エラー
-
[解決済み] コマンドラインを使用してJSONオブジェクトの項目をカウントする方法は?
-
[解決済み] JSON APIのレスポンス形式には規格がありますか?
-
[解決済み] ASP.NETでJSONを単純なDictionary<string,string>にデシリアライズするにはどうすればよいですか?
-
[解決済み] VSCodeでlaunch.jsonに環境変数を追加する方法
-
[解決済み] ネストされたJSONオブジェクトのアンマーシャリング
-
[解決済み] GoでJSONを部分的にマップにアンマーシャルする
-
[解決済み] SwiftでHTMLエンティティをデコードするには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】tsconfig.json: Build:No inputs were found in config file.
-
[解決済み] Postgresで、レコードにjsonや文字列が混在している場合に、'invalid input syntax for type json'を防ぐにはどうしたらよいでしょうか。
-
[解決済み] JSONとは何か、何に使うのか?
-
[解決済み] JSONでnullを表現する
-
[解決済み] JSONのXSLT対応
-
[解決済み] JSONオブジェクトに末尾のカンマを使用することは可能ですか?
-
[解決済み] jqを使用して、オブジェクト内の変数の値に基づいてオブジェクトを選択します。
-
[解決済み] VSCodeでlaunch.jsonに環境変数を追加する方法
-
[解決済み] Mongo コレクションを JSON 形式にダンプする
-
[解決済み] JSONオブジェクトをBufferに変換し、BufferをJSONオブジェクトに戻す。