Smail_的gravatar头像
Smail_2017-11-13 09:13:26
Springboot resttemplate之fastjon替换jackson以及getForObject请求时添加header的解决办法

Springboot很好用!

好用的同时总是少不了一些坑,或许我是才接触没多久的缘故吧!

1.resttemplate fastjson替换jackson

fastjson是国人的骄傲,符合国人的使用习惯。jackson的时间格式化坑:

Springboot resttemplate之fastjon替换jackson以及getForObject请求时添加header的解决办法

网上有解决办法,但是我项目的model太多了,安装网上其他人的办法,需要修改model加时间格式化的注解。

解决方案——从resttemplate中移除掉与jackson相关的messageconvert,添加fastjson的messageconvert:

/**
     * 初始化RestTemplate,并给RestTemplate设置超时时间,同时使用fastjson替换RestTemplate的jackson
     */
    @Bean
    @LoadBalanced
    @ConditionalOnMissingBean(CustomRestTemplate.class)
    CustomRestTemplate restTemplate() {
        HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();
        clientHttpRequestFactory.setConnectTimeout(1000);
        CustomRestTemplate restTemplate = new CustomRestTemplate();
        restTemplate.setRequestFactory(clientHttpRequestFactory);

        List<HttpMessageConverter<?>> converters = restTemplate.getMessageConverters();
        List<HttpMessageConverter<?>> convertersValid = new CustomArrayList<HttpMessageConverter<?>>();
        for (HttpMessageConverter<?> converter : converters) {
            if (converter instanceof MappingJackson2HttpMessageConverter || converter instanceof MappingJackson2XmlHttpMessageConverter)continue;
            convertersValid.add(converter);
        }
        convertersValid.add(fastJsonHttpMessageConverter());
        restTemplate.setMessageConverters(convertersValid);

        return restTemplate;
    }
HttpMessageConverter fastJsonHttpMessageConverter() {
   List<MediaType> mediaTypes = new CustomArrayList<MediaType>().addObject(MediaType.APPLICATION_JSON_UTF8);

   FastJsonConfig fastJsonConfig = new FastJsonConfig();
   fastJsonConfig.setSerializerFeatures(SerializerFeature.DisableCircularReferenceDetect, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteDateUseDateFormat);
       fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");

   FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
   fastConverter.setSupportedMediaTypes(mediaTypes);
   fastConverter.setFastJsonConfig(fastJsonConfig);

   return fastConverter;
}

2.getForObject请求时添加header

resttemplate的getForObject请求默认是向服务提供方获取xml格式的数据。这里有个坑,服务端回传一个Map<String,List>的对象时,如果List的长度是1,xml会把这个List搞成一个String。

我要resttemplate getForObject返回json,解决办法最简单的就是在服务方的requestmapping上加produces="application/json",如果服务方的api很多,呵呵,这是个噩梦!

所以,能不能让客户方主动要求服务方提供json格式的数据?

google了一番,最后放弃了,还不如直接继承restTemplate,拓展一个自己的getForObject来得快:

/**
 *
 * 自定义的RestTemplate
 * 解决get请求加头的问题
 *
 */
public class CustomRestTemplate extends RestTemplate {
    public <T> T getForObject(String url, HttpHeaders headers, Class<T> responseType, Object... uriVariables) throws RestClientException {
        ResponseEntity<T> response = this.exchange(url, HttpMethod.GET, new HttpEntity<>(headers), responseType, uriVariables);
        return response.getBody();
    }
}

两个问题解决!


打赏

已有1人打赏

最代码官方的gravatar头像

分享到:

最近浏览
cqy646 LV17月3日
星星
widezhou LV16月12日
星星
笑看风云 LV46月3日
月亮
whjqwer5月29日
暂无贡献等级
yujunchun LV75月25日
月亮星星星星星星
小凳儿 LV85月18日
月亮月亮
shadow1 LV14月19日
星星
wkc LV154月9日
月亮月亮月亮星星星星星星
robingao3月27日
暂无贡献等级
majunmin LV13月18日
星星
顶部客服微信二维码底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友