项目中使用RestTemplateBuilder的build创建RestTemplate对象,但是发现使用

return restTemplateBuilder.messageConverters(getMessageConverters()).build();

// getMessageCOnverters
List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
        messageConverters.add(new StringHttpMessageConverter(Charset.forName("UTF-8")));
        messageConverters.add(new FormHttpMessageConverter());
        // 用FastJson替代原生的jackson转换器
        FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
        fastJsonHttpMessageConverter.setSupportedMediaTypes(supportedMediaTypes);
        messageConverters.add(fastJsonHttpMessageConverter);
    messageConverters.add(new ByteArrayHttpMessageConverter());

自己定义了需要添加的MessageConverter的转换方法。

后面在使用restTemplate.exchage()方法调用:

ResponseEntity<byte[]> response = proxyRestTemplate
                .exchange(url, HttpMethod.GET, entity, byte[].class);

但是发现无论如何调用返回的response中的body都是null。

逐步debug发现 这里会调用到之前配置的messageConverters中的所有转换器。 然后遍历转化器,找到能够转换的转换器进行数据转换。 因为之前的配置中Json的转换在ByteArrayHttpMessageConverter之前,而使用的FastJsonHttpMessageConverter转换器正好实现了GenericHttpMessageConverter,导致在还未用ByteArrayHttpMessageConverter进行处理时已经将数据处理。同时json的转换器对文件流并不支持,返回了null。

后调整了MessageConverters,解决问题。