强制Spring RestTemplate将纯文本处理为JSON?

时间:2018-03-24 21:05:06

标签: java json spring rest

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是纯文本的?

1 个答案:

答案 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());