SpringBoot restTemplate fastjson 中文乱码问题解决

问题:

用restTemplate发送post请求,解析json数据,返回结果中文乱码。

String result = restTemplate.postForObject(restfulUrl, map, String.class);

解决:

方法一:使用FastJsonHttpMessageConverter,设置MediaType为application/json;charset=UTF-8,并放在converters中的第1位。

@Configuration
public class WebMvcConfig {

    @Bean
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate();
        List> converters= restTemplate.getMessageConverters();
        List fastMediaTypes = new ArrayList<>();
        // 处理中文乱码问题
        fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
        FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
        fastConverter.setSupportedMediaTypes(fastMediaTypes);
        converters.add(0, fastConverter);
        return restTemplate;
    }
}

方法二:

如果没有使用fastjson,可以设置StringHttpMessageConverter的MediaType为application/json;charset=UTF-8

@Configuration
public class WebMvcConfig {

    @Bean
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate();
        StringHttpMessageConverter stringConverter = new StringHttpMessageConverter();
        List> converters= restTemplate.getMessageConverters();
        List fastMediaTypes = new ArrayList<>();
        // 处理中文乱码问题
        fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
        stringConverter.setSupportedMediaTypes(fastMediaTypes);
        restTemplate.getMessageConverters().set(1, stringConverter);
        return restTemplate;
    }
}

原因:

因为restTemplate默认加载了好几个消息转换器(converters),这里返回值类型是String,所以默认会使用StringHttpMessageConverter去处理,而StringHttpMessageConverter的媒体类型(MediaType)和字符集(charset)是text/plain 和ISO-8859-1,不符合要求,如下图。所以要设置下。

SpringBoot restTemplate fastjson 中文乱码问题解决_第1张图片

你可能感兴趣的:(springboot)