Nuñ*_*ada 39 rest spring json spring-mvc resttemplate
使用curl命令:
curl -u 591bf65f50057469f10b5fd9:0cf17f9b03d056ds0e11e48497e506a2 https://backend.tdk.com/api/devicetypes/59147fd79e93s12e61499ffe/messages
Run Code Online (Sandbox Code Playgroud)
我收到了JSON响应:
{"data":[{"device":"18SE62","time":1494516023,"data":"3235","snr":"36.72",...
Run Code Online (Sandbox Code Playgroud)
我将响应保存在txt文件中并使用jackson解析它,一切都很好
ObjectMapper mapper = new ObjectMapper();
File f = new File(getClass().getResource
("/result.json").getFile());
MessageList messageList = mapper.readValue(f, MessageList.class);
Run Code Online (Sandbox Code Playgroud)
我假设我应该使用RestTemplate获得相同的结果但事实并非如此
RestTemplate restTemplate = new RestTemplate();
MessageList messageList =
restTemplate.getForObject("http://592693f43c87815f9b8145e9:f099c85d84d4e325a2186c02bd0caeef@backend.tdk.com/api/devicetypes/591570373c87894b4eece34d/messages", MessageList.class);
Run Code Online (Sandbox Code Playgroud)
我得到了一个错误
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)
Run Code Online (Sandbox Code Playgroud)
我试着设置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);
Run Code Online (Sandbox Code Playgroud)
但后来我遇到了编译错误
The method getForObject(String, Class<T>, Object...) in the type RestTemplate is not applicable for the arguments (String, HttpEntity<String>,
Class<MessageList>)
Run Code Online (Sandbox Code Playgroud)
我还尝试添加一个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);
Run Code Online (Sandbox Code Playgroud)
但后来我收到了这个错误:
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)
Run Code Online (Sandbox Code Playgroud)
我也尝试过添加课程
@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;
}
}
Run Code Online (Sandbox Code Playgroud)
但是我得到了错误:
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)
Run Code Online (Sandbox Code Playgroud)
Ily*_*hin 88
这里的主要问题是从服务中收到的内容类型[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);
Run Code Online (Sandbox Code Playgroud)
小智 25
我遇到了一个非常类似的问题,结果很简单; 我的客户端不包括杰克逊依赖,即使代码都编译正确,JSON的自动魔术转换器没有被包括在内.请参阅RestTemplate相关解决方案.
简而言之,我在我的pom.xml中添加了一个Jackson依赖项,它只是起作用:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
Ale*_*x R 20
尽管接受的答案解决了OP的原始问题,但我怀疑大多数人通过Google搜索找到此问题的可能性(从统计角度而言)可能是一个完全不同的问题,只是抛出了相同的HttpMessageConverter未发现异常。
幕后发生的事情是MappingJackson2HttpMessageConverter吞没其canRead()方法中发生的任何异常,该异常应该可以自动检测有效载荷是否适合json解码。该异常被一个简单的布尔值返回所取代,该布尔值基本上表示对不起,我不知道如何将该消息解码为更高级别的API(RestClient)。只有在所有其他转换器的canRead()方法返回false之后,更高级别的API才会抛出未找到合适的HttpMessageConverter异常,这完全掩盖了真正的问题。
对于尚未找到根本原因的人(例如您和我,但不是OP),解决此问题的方法是将调试器断点放在上onMappingJackson2HttpMessageConverter.canRead(),然后对任何异常启用常规断点,然后单击继续。下一个例外是真正的根本原因。
我的特定错误恰巧是其中一个bean引用了缺少正确的反序列化注释的接口。
这是我每次看到此类错误时遵循的方法:
Gson().fromJson(StringResp.body(), MyDTO.class). 它仍然很可能会失败,但这次它会首先抛出创建此错误的字段。修改后,我们可以照常使用之前的方法。ResponseEntity<String> respStr = restTemplate.exchange(URL,HttpMethod.GET, entity, String.class);
Gson g = new Gson();
以下步骤将引发问题的字段错误
MyDTO resp = g.fromJson(respStr.getBody(), MyDTO.class);
Run Code Online (Sandbox Code Playgroud)
我没有错误消息,但它会指向有问题的字段及其原因。解决这些问题,然后用以前的方法重试。
如果上述@Ilya Dyoshin的响应仍未检索到,请尝试将响应放入字符串对象。
(以我个人的想法,该错误已由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);
Run Code Online (Sandbox Code Playgroud)
并投射到ResponseObject DTO(Json)
Gson g = new Gson();
DTO dto = g.fromJson(st.getBody(), DTO.class);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
97175 次 |
| 最近记录: |