1. ホーム
  2. java

[解決済み] 応答タイプに適した HttpMessageConverter が見つかりませんでした。

2022-02-02 06:25:19

質問

Springを使用して、このコードで。

List<HttpMessageConverter<?>> messageConverters = restTemplate.getMessageConverters();
for(HttpMessageConverter httpMessageConverter : messageConverters){
  System.out.println(httpMessageConverter);
}
ResponseEntity<ProductList> productList = restTemplate.getForEntity(productDataUrl,ProductList.class);

私は

org.springframework.http.converter.ByteArrayHttpMessageConverter@34649ee4
org.springframework.http.converter.StringHttpMessageConverter@39fba59b
org.springframework.http.converter.ResourceHttpMessageConverter@383580da
org.springframework.http.converter.xml.SourceHttpMessageConverter@409e850a
org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter@673074aa
org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter@1e3b79d3
org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@52bb1b26

org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [class com.mycopmany.ProductList] and content type [text/html;charset=UTF-8]

pojoのスニペット。

@XmlRootElement(name="TheProductList")
public class ProductList {

@XmlElement(required = true, name = "date")
private LocalDate importDate;

解決方法は?

Springの観点から見ると、どの HttpMessageConverter で登録されたインスタンスは RestTemplate を変換することができます。 text/html コンテンツに ProductList オブジェクトを作成します。注目のメソッドは HttpMessageConverter#canRead(Class, MediaType) . 上記すべての実装は false を含む。 Jaxb2RootElementHttpMessageConverter .

がないため HttpMessageConverter は HTTP レスポンスを読み取ることができないため、例外が発生して処理に失敗します。

サーバーのレスポンスを制御できる場合は、それを修正して Content-type から application/xml , text/xml または、次のようなものがあります。 application/*+xml .

サーバーの応答を制御しない場合は、自分で書いて登録する必要があります。 HttpMessageConverter (Springのクラスを拡張することができます。 AbstractXmlHttpMessageConverter とそのサブクラス)を読み込んで変換することができます。 text/html .