Java 强制SpringRestTemplate将纯文本处理为JSON?
web API以Java 强制SpringRestTemplate将纯文本处理为JSON?,java,json,spring,rest,Java,Json,Spring,Rest,web API以内容类型响应请求:text/plain;charset=utf-8,但是消息的格式就像是JSON一样,例如 { "total": 168, "page": 0, "pageCount": 1, ... } 在Spring中,此消息使用RestTemplate处理,JSON自动映射到ModelDtoPOJO restTemplate.getForObject(url, ModelDto::class.java) 这会产生以下错误: org.springframework.we
内容类型响应请求: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:无法提取响应:未找到响应类型[class api.ModelDto]和内容类型[text/plain;charset=utf-8]的合适HttpMessageConverter
有没有办法让spring将此消息视为JSON并将其解析为JSON,尽管内容类型为纯文本?已更新 无需创建自定义的
HttpMessageConverter
,因为AbstractHttpMessageConverter
有一个方法setSupportedMediaTypes
,可用于更改支持的媒体类型:
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setSupportedMediaTypes(Arrays.asList(MediaType.TEXT_PLAIN, MediaType.APPLICATION_JSON));
restTemplate.getMessageConverters().add(0, converter);
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(");");
}
}
}
我认为通过实现自己的
HttpMessageConverter
是可能的
restemplate
使用它将原始响应转换为某种表示(例如,POJO)。因为它有一个转换器列表,所以它会根据特定响应的类型(例如application/json
等)查找特定响应的特定转换器
因此,您的HttpMessageConverter
实现应该类似于默认的MappingJackson2HttpMessageConverter
,但支持的媒体类型已更改:
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setSupportedMediaTypes(Arrays.asList(MediaType.TEXT_PLAIN, MediaType.APPLICATION_JSON));
restTemplate.getMessageConverters().add(0, converter);
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());
谢谢,让我尝试一下,会得到回望,就像另一种方法是只更改入站标题一样。更新我的answer@MykolaYashchenko
MappingJackson2HttpMessageConverter=新的MappingJackson2HttpMessageConverter();setSupportedMediaTypes(Arrays.asList(TEXT_PLAIN,MediaType.APPLICATION_JSON));restemplate.getMessageConverters().add(0,converter)代码>我在转换器中添加了文本\u PLAIN,但仍然面临相同的问题<代码>[class com.fasterxml.jackson.databind.JsonNode]和内容类型[text/plain;charset=ISO-8859-1]
@NagendraNigade我想原因是“text/plain;charset=ISO-8859-1”与“text/plain”不同