当前位置: 首页 > 知识库问答 >
问题:

RestClientException:无法提取响应。未找到合适的HttpMessageConverter

茅星雨
2023-03-14

使用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:f099c85d84d4e325a2186c02bd0caeef@backend.tdk.com/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消息转换器中添加一个

  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)

共有3个答案

戴浩初
2023-03-14

我遇到了一个非常类似的问题,结果很简单;我的客户机没有包含Jackson依赖项,即使代码编译正确,也没有包含JSON的自动魔术转换器。请参阅此RestTemplate相关解决方案。

简而言之,我在pom中添加了一个Jackson依赖项。xml,它刚刚起作用:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.5.1</version>
</dependency>
贲俊才
2023-03-14

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

在封面下发生的事情是,MappingJackson2HttpMessageConzer吞下了它的canRead()方法中出现的任何异常,该方法应该自动检测有效负载是否适合json解码。异常被一个简单的布尔返回所取代,它基本上传达了抱歉,我不知道如何将此消息解码到更高级别的API(RestClient)。只有在所有其他转换器的canRead()方法返回false后,更高级别的API才会抛出没有合适的HttpMessageConzer异常,完全掩盖了真正的问题。

对于尚未找到根本原因的人(如您和我,但不是OP),解决此问题的方法是在onMappingJackson2HttpMessageConverter上放置调试器断点。canRead(),然后在任何异常上启用常规断点,然后单击Continue。下一个例外是真正的根本原因。

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

未来的更新

在我的许多项目中,这已经被证明是一个反复出现的问题,以至于我开发了一个更积极主动的解决方案。每当我需要专门处理JSON(没有XML或其他格式)时,我现在用以下实例替换我的RestTem板bean:

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以外的任何内容。好处是,任何可能发生的错误消息都会更明确地说明错误所在。

濮泳
2023-03-14

这里的主要问题是从服务接收的内容类型[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); 
 类似资料:
  • 我正在写一个Springmvc应用程序(Spring新手),它必须调用Rest服务。我有其余的服务部署在我的VM(weblogic 10.3.6在Linux)和我写的应用程序是在我的本地笔记本电脑weblogic(10.3.6在Windows 8.1)。 当我尝试调用rest服务时,restservice应用程序的请求正常,但响应失败,并显示以下消息 我正在初始化控制器中的其余客户端 在实际的客户

  • 我正在打一个服务来查找一个人的详细信息,响应是xml格式的,如下所示: 我正在使用Spring RestTempate并将响应映射到以下POJO, 我使用rest模板调用服务, 但我一直得到异常,org.springframework.web.client.RestClientExcture:无法提取响应:没有找到适合的HttpMessageConzer响应类型[类[Lcom.cdk.datalo

  • 我是新的Spring集成和工作在Spring集成超文本传输协议模块为我的项目要求。我从出站网关作为超文本传输协议客户端发送请求。我试图向服务器发起一个请求,服务器应该用我的设置值返回消息负载。我正在将对象转换为JSON,用于发送到服务器我正在从客户端(HttpClientDemo)向服务器端的入站网关发送请求。为此,我将我的对象转换成JSON,然后将JSON字符串转换为客户端的对象,在那里执行一些

  • 我正在尝试使用spring for Android从REST服务中检索一些数据。但是我遇到了问题。我也在使用Robospice——因此有一种类似这样的方法: 不幸的是,这不起作用。我将引发以下异常: 现在,基于我的谷歌搜索,我觉得我需要添加一个消息转换器。我只是不确定我需要哪个消息转换器,或者在哪里添加它?

  • 我试图让一个Spring CloudNetflixFaignes客户端通过HTTP获取一点JSON并将其转换为对象。我一直得到这个错误,而不是: 组织。springframework。网状物客户RestClientException:无法提取响应:未找到响应类型[class io.urig.checkout.Book]和内容类型[application/json;charset=UTF-8]的合适

  • 我有以下几点建议: 当我对它执行cucumber测试时,我得到以下异常: 我有一些其他的测试和其他具有相同注释的POJO,它们工作起来没有任何问题。我真的一点也不知道出了什么问题。 感谢任何建议!