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

时间:2022-10-14 15:25:44

Using the curl command:

使用curl命令:

curl -u 591bf65f50057469f10b5fd9:0cf17f9b03d056ds0e11e48497e506a2 https://backend.tdk.com/api/devicetypes/59147fd79e93s12e61499ffe/messages

I an getting a JSON response:

我得到了一个JSON响应:

{"data":[{"device":"18SE62","time":1494516023,"data":"3235","snr":"36.72",...

I save the response on a txt file and parse it using jackson, and everything is fine

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

ObjectMapper mapper = new ObjectMapper();
        File f = new File(getClass().getResource
                    ("/result.json").getFile());
        MessageList messageList = mapper.readValue(f, MessageList.class);

and I asume I should get the same result using RestTemplate but It is not the case

而且我认为我应该使用RestTemplate得到相同的结果但事实并非如此

RestTemplate restTemplate = new RestTemplate();
        MessageList messageList = 
                restTemplate.getForObject("http://592693f43c87815f9b8145e9:f099c85d84d4e325a2186c02bd0caeef@backend.tdk.com/api/devicetypes/591570373c87894b4eece34d/messages", MessageList.class);

I got an error instead

我得到了一个错误

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)

I tried to set the content Type:

我试着设置内容类型:

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);

but then I got a compilation error

但后来我遇到了编译错误

The method getForObject(String, Class<T>, Object...) in the type RestTemplate is not applicable for the arguments (String, HttpEntity<String>, 
 Class<MessageList>)

I also tried to add a the Jackson Message converter

我还尝试添加一个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);

But then I got this error:

但后来我收到了这个错误:

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)

I also tried adding the class

我也尝试过添加课程

@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;
    }

}

but I got the error:

但是我得到了错误:

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 个解决方案

#1


32  

The main problem here is content type [text/html;charset=iso-8859-1] received from the service, however the real content type should be application/json;charset=iso-8859-1

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

In order to overcome this you can introduce custom message converter. and register it for all kind of responses (i.e. ignore the response content type header). Just like this

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

  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(Arrays.asList({MediaType.ALL}));         
   messageConverters.add(converter);  
   restTemplate.setMessageConverters(messageConverters);  

#2


7  

I was having a very similar problem, and it turned out to be quite simple; my client wasn't including a Jackson dependency, even though the code all compiled correctly, the auto-magic converters for JSON weren't being included. See this RestTemplate-related solution.

我遇到了一个非常类似的问题,结果很简单;我的客户端不包括杰克逊依赖,即使代码都编译正确,JSON的自动魔术转换器没有被包括在内。请参阅RestTemplate相关解决方案。

In short, I added a Jackson dependency to my pom.xml and it just worked:

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

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.5.1</version>
</dependency>

#3


3  

If the above response by @Ilya Dyoshin didn't still retrieve, try to get the response into a String Object.

如果@Ilya Dyoshin的上述响应仍未检索,请尝试将响应转换为String对象。

(For my self thought the error got solved by the code snippet by Ilya, the response retrieved was a failure(error) from the server.)

(我自己认为错误是由Ilya的代码片段解决的,检索到的响应是来自服务器的失败(错误)。)

HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.add(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded");
ResponseEntity<String> st = restTemplate.exchange(url, HttpMethod.POST, httpEntity, String.class); 

And Cast to the ResponseObject DTO (Json)

并转换为ResponseObject DTO(Json)

Gson g = new Gson();
DTO dto = g.fromJson(st.getBody(), DTO.class); 

#1


32  

The main problem here is content type [text/html;charset=iso-8859-1] received from the service, however the real content type should be application/json;charset=iso-8859-1

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

In order to overcome this you can introduce custom message converter. and register it for all kind of responses (i.e. ignore the response content type header). Just like this

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

  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(Arrays.asList({MediaType.ALL}));         
   messageConverters.add(converter);  
   restTemplate.setMessageConverters(messageConverters);  

#2


7  

I was having a very similar problem, and it turned out to be quite simple; my client wasn't including a Jackson dependency, even though the code all compiled correctly, the auto-magic converters for JSON weren't being included. See this RestTemplate-related solution.

我遇到了一个非常类似的问题,结果很简单;我的客户端不包括杰克逊依赖,即使代码都编译正确,JSON的自动魔术转换器没有被包括在内。请参阅RestTemplate相关解决方案。

In short, I added a Jackson dependency to my pom.xml and it just worked:

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

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.5.1</version>
</dependency>

#3


3  

If the above response by @Ilya Dyoshin didn't still retrieve, try to get the response into a String Object.

如果@Ilya Dyoshin的上述响应仍未检索,请尝试将响应转换为String对象。

(For my self thought the error got solved by the code snippet by Ilya, the response retrieved was a failure(error) from the server.)

(我自己认为错误是由Ilya的代码片段解决的,检索到的响应是来自服务器的失败(错误)。)

HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.add(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded");
ResponseEntity<String> st = restTemplate.exchange(url, HttpMethod.POST, httpEntity, String.class); 

And Cast to the ResponseObject DTO (Json)

并转换为ResponseObject DTO(Json)

Gson g = new Gson();
DTO dto = g.fromJson(st.getBody(), DTO.class);