找不到适合响应类型的 HttpMessageConverter

新手上路,请多包涵

使用 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;

原文由 NimChimpsky 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 816
2 个回答

From a Spring point of view, none of the HttpMessageConverter instances registered with the RestTemplate can convert text/html content to a ProductList object.感兴趣的方法是 HttpMessageConverter#canRead(Class, MediaType) 。以上所有的实现返回 false ,包括 Jaxb2RootElementHttpMessageConverter

由于没有 HttpMessageConverter 可以读取您的 HTTP 响应,因此处理失败并出现异常。

If you can control the server response, modify it to set the Content-type to application/xml , text/xml , or something matching application/*+xml .

如果您不控制服务器响应,则需要编写并注册自己的 HttpMessageConverter (可以扩展 Spring 类,请参阅 AbstractXmlHttpMessageConverter 及其子类)读取并转换 text/html

原文由 Sotirios Delimanolis 发布,翻译遵循 CC BY-SA 3.0 许可协议

您也可以简单地告诉您的 RestTemplate 接受所有媒体类型:

 @Bean
public RestTemplate restTemplate() {
   final RestTemplate restTemplate = new RestTemplate();

   List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
   MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
   converter.setSupportedMediaTypes(Collections.singletonList(MediaType.ALL));
   messageConverters.add(converter);
   restTemplate.setMessageConverters(messageConverters);

   return restTemplate;
}

原文由 Markoorn 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题