首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >RestClientException:无法提取响应。没有找到合适的HttpMessageConverter

RestClientException:无法提取响应。没有找到合适的HttpMessageConverter
EN

Stack Overflow用户
提问于 2017-05-25 08:55:11
回答 15查看 293.3K关注 0票数 83

使用curl命令:

代码语言:javascript
运行
复制
curl -u 591bf65f50057469f10b5fd9:0cf17f9b03d056ds0e11e48497e506a2 https://backend.tdk.com/api/devicetypes/59147fd79e93s12e61499ffe/messages

我得到了一个JSON响应:

代码语言:javascript
运行
复制
{"data":[{"device":"18SE62","time":1494516023,"data":"3235","snr":"36.72",...

我将响应保存在txt文件中,并使用jackson解析它,一切都很好。

代码语言:javascript
运行
复制
ObjectMapper mapper = new ObjectMapper();
        File f = new File(getClass().getResource
                    ("/result.json").getFile());
        MessageList messageList = mapper.readValue(f, MessageList.class);

我想我应该用RestTemplate得到同样的结果,但事实并非如此

代码语言:javascript
运行
复制
RestTemplate restTemplate = new RestTemplate();
        MessageList messageList = 
                restTemplate.getForObject("http://592693f43c87815f9b8145e9:f099c85d84d4e325a2186c02bd0caeef@backend.tdk.com/api/devicetypes/591570373c87894b4eece34d/messages", MessageList.class);

我有个错误

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
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);

但是我得到了一个编译错误

代码语言:javascript
运行
复制
The method getForObject(String, Class<T>, Object...) in the type RestTemplate is not applicable for the arguments (String, HttpEntity<String>, 
 Class<MessageList>)

我还试图添加一个Jackson消息转换器。

代码语言:javascript
运行
复制
  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);

但是我得到了一个错误:

代码语言:javascript
运行
复制
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)

我还试着增加了这个类

代码语言:javascript
运行
复制
@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;
    }

}

但我发现了一个错误:

代码语言:javascript
运行
复制
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)
EN

回答 15

Stack Overflow用户

回答已采纳

发布于 2017-05-27 17:33:52

这里的主要问题是从服务接收到的application/json;charset=iso-8859-1内容类型text/html;charset=iso-8859-1,但是实际的内容类型应该是。

为了克服这一点,您可以引入自定义消息转换器。并将其注册为所有类型的响应(即忽略响应内容类型标头)。就像这样

代码语言:javascript
运行
复制
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); 
票数 157
EN

Stack Overflow用户

发布于 2018-08-30 18:12:04

虽然公认的答案解决了OP最初的问题,但大多数人通过谷歌搜索发现这个问题可能有一个完全不同的问题,只是碰巧抛出了相同的问题,没有合适的HttpMessageConverter发现异常。

在幕后发生的是,MappingJackson2HttpMessageConverter吞并了在其canRead()方法中发生的任何异常,该方法应该自动检测有效负载是否适合json解码。这个异常被一个简单的布尔返回所代替,这个返回基本上表示抱歉,我不知道如何将此消息解码到更高级别的API (RestClient)。只有在所有其他转换器的canRead()方法返回false之后,高级API才会抛出不合适的HttpMessageConverter找到的异常,这完全掩盖了真正的问题。

对于没有找到根本原因的人(比如您和我,但没有找到OP),解决此问题的方法是在onMappingJackson2HttpMessageConverter.canRead()上放置一个调试器断点,然后在任何异常上启用一个通用断点,然后单击“继续”。下一个异常是真正的根本原因。

我的具体错误恰好是其中一个bean引用了一个缺少正确反序列化注释的接口。

来自未来更新

事实证明,在我的许多项目中,这是一个反复出现的问题,因此我开发了一个更积极的解决方案。每当我需要专门处理JSON时(不使用XML或其他格式),我现在用以下实例替换RestTemplate bean:

代码语言:javascript
运行
复制
public class JsonRestTemplate extends RestTemplate {

    public JsonRestTemplate(
            ClientHttpRequestFactory clientHttpRequestFactory) {
        super(clientHttpRequestFactory);

        // Force a sensible JSON mapper.
        // Customize as needed for your project's definition of "sensible":
        ObjectMapper objectMapper = new ObjectMapper()
                .registerModule(new Jdk8Module())
                .registerModule(new JavaTimeModule())
                .configure(
                        SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

        List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
        MappingJackson2HttpMessageConverter jsonMessageConverter = new MappingJackson2HttpMessageConverter() {

            public boolean canRead(java.lang.Class<?> clazz,
                    org.springframework.http.MediaType mediaType) {
                return true;
            }    
            public boolean canRead(java.lang.reflect.Type type,
                    java.lang.Class<?> contextClass,
                    org.springframework.http.MediaType mediaType) {
                return true;
            }
            protected boolean canRead(
                    org.springframework.http.MediaType mediaType) {
                return true;
            }
        };

        jsonMessageConverter.setObjectMapper(objectMapper);
        messageConverters.add(jsonMessageConverter);
        super.setMessageConverters(messageConverters);

    }
}

这种定制使RestClient无法理解除JSON之外的任何东西。好处是,任何可能发生的错误信息都将更加清楚地说明错误所在。

票数 70
EN

Stack Overflow用户

发布于 2018-02-08 20:59:33

我遇到了一个非常类似的问题,结果非常简单;我的客户端没有包含Jackson依赖项,尽管代码编译都是正确的,但是JSON的自动魔术转换器并没有被包括在内。请参阅这个与餐厅模板相关的解决方案。

简而言之,我在我的pom.xml中添加了一个杰克逊依赖项,它只是起作用了:

代码语言:javascript
运行
复制
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.5.1</version>
</dependency>
票数 46
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44176335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档