Web API正在响应Content-Type:text/plain; charset=utf-8
的请求,但该消息的格式就像是JSON,例如。
{
"total": 168,
"page": 0,
"pageCount": 1,
...
}
在Spring中,使用RestTemplate处理此消息,并将JSON自动映射到ModelDto
POJO,
restTemplate.getForObject(url, ModelDto::class.java)
这会出现以下错误:
org.springframework.web.client.RestClientException:无法提取响应:没有为响应类型找到合适的HttpMessageConverter [类api.ModelDto]和内容类型[text / plain; charset = utf-8]
有没有办法让spring将这条消息看作是一个JSON并解析它,尽管Content-Type是纯文本的?
答案 0 :(得分:2)
<强>已更新强>
无需创建自定义HttpMessageConverter
,因为AbstractHttpMessageConverter
的方法setSupportedMediaTypes
可用于更改支持的媒体类型:
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
coverter.setSupportedMediaTypes(Arrays.asList(MediaType.TEXT_PLAIN, MediaType.APPLICATION_JSON);
restTemplate.getMessageConverters().add(0, converter);
我认为可以通过实施自己的HttpMessageConverter<T>
来实现。
RestTemplate
使用它将原始响应转换为某种表示形式(例如,POJO)。由于它有一个转换器列表,它会根据其类型找到特定响应的特定转换器(例如application/json
等)。
因此,HttpMessageConverter<T>
的实施应该类似于默认MappingJackson2HttpMessageConverter
,但支持的媒体类型已更改:
public class MappingJackson2HttpMessageConverter2 extends AbstractJackson2HttpMessageConverter {
private String jsonPrefix;
public MappingJackson2HttpMessageConverter2() {
this(Jackson2ObjectMapperBuilder.json().build());
}
public MappingJackson2HttpMessageConverter2(ObjectMapper objectMapper) {
// here changed media type
super(objectMapper, MediaType.TEXT_PLAIN);
}
public void setJsonPrefix(String jsonPrefix) {
this.jsonPrefix = jsonPrefix;
}
public void setPrefixJson(boolean prefixJson) {
this.jsonPrefix = (prefixJson ? ")]}', " : null);
}
@Override
protected void writePrefix(JsonGenerator generator, Object object) throws IOException {
if (this.jsonPrefix != null) {
generator.writeRaw(this.jsonPrefix);
}
String jsonpFunction =
(object instanceof MappingJacksonValue ? ((MappingJacksonValue) object).getJsonpFunction() : null);
if (jsonpFunction != null) {
generator.writeRaw("/**/");
generator.writeRaw(jsonpFunction + "(");
}
}
@Override
protected void writeSuffix(JsonGenerator generator, Object object) throws IOException {
String jsonpFunction =
(object instanceof MappingJacksonValue ? ((MappingJacksonValue) object).getJsonpFunction() : null);
if (jsonpFunction != null) {
generator.writeRaw(");");
}
}
}
然后您可以将其添加到RestTemplate
对象:
restTemplate.getMessageConverters().add(0, new MappingJackson2HttpMessageConverter2());