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

Ada*_*hes 6 java rest spring json

Web API 正在响应带有 的请求Content-Type:text/plain; charset=utf-8,但消息的格式就像 JSON 一样,例如。

{
"total": 168,
"page": 0,
"pageCount": 1,
...
}
Run Code Online (Sandbox Code Playgroud)

在 Spring 中,此消息使用 RestTemplate 进行处理,并且 JSON 会自动映射到ModelDtoPOJO,

restTemplate.getForObject(url, ModelDto::class.java) 
Run Code Online (Sandbox Code Playgroud)

这会产生以下错误:

org.springframework.web.client.RestClientException:无法提取响应:没有找到适合响应类型 [class api.ModelDto] 和内容类型 [text/plain;charset=utf-8] 的 HttpMessageConverter

尽管 Content-Type 是纯文本,有什么方法可以让 spring 将此消息视为 JSON 并对其进行解析?

Myk*_*nko 9

更新

无需创建自定义,HttpMessageConverter因为AbstractHttpMessageConverter有一个setSupportedMediaTypes可用于更改支持的媒体类型的方法:

MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setSupportedMediaTypes(Arrays.asList(MediaType.TEXT_PLAIN, MediaType.APPLICATION_JSON));
restTemplate.getMessageConverters().add(0, converter);
Run Code Online (Sandbox Code Playgroud)

我认为通过实施自己的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(");");
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

然后你可以将其添加到RestTemplate对象中:

restTemplate.getMessageConverters().add(0, new MappingJackson2HttpMessageConverter2());
Run Code Online (Sandbox Code Playgroud)