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头像

分享到:

最近浏览
yjx45100132017年12月20日
最代码贡献等级说明
MrNull2017年11月20日
最代码贡献等级说明
4069717272017年11月20日
最代码贡献等级说明
lcjz992017年11月17日
最代码贡献等级说明
perfect2017年11月17日
最代码贡献等级说明
coding喵2017年11月14日
最代码贡献等级说明
weienqing2017年11月14日
最代码贡献等级说明
macarthur112017年11月14日
最代码贡献等级说明
心印语2017年11月14日
最代码贡献等级说明
W1s921t2017年11月13日
暂无贡献等级
ReakerL2017年11月13日
最代码贡献等级说明
心就那么大地儿2017年11月13日
暂无贡献等级
lhhaige2017年11月13日
暂无贡献等级
xmjiangbin2017年11月13日
最代码贡献等级说明
hackxhao2017年11月13日
最代码贡献等级说明
hwk_1232017年11月13日
最代码贡献等级说明
程序猿全敏 LV32017年11月13日
最代码贡献等级说明
willian12017年11月13日
暂无贡献等级
小王wang2017年11月13日
最代码贡献等级说明
Watson2017年11月13日
最代码贡献等级说明
顶部客服微信二维码底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友