Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 强制SpringRestTemplate将纯文本处理为JSON?_Java_Json_Spring_Rest - Fatal编程技术网

Java 强制SpringRestTemplate将纯文本处理为JSON?

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

web API以
内容类型响应请求: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”不同