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

分享到:

最近浏览
lcjz99昨天
最代码贡献等级说明
perfect昨天
最代码贡献等级说明
coding喵11月14日
最代码贡献等级说明
weienqing11月14日
最代码贡献等级说明
macarthur1111月14日
最代码贡献等级说明
心印语11月14日
最代码贡献等级说明
W1s921t11月13日
暂无贡献等级
ReakerL11月13日
最代码贡献等级说明
暂无贡献等级
lhhaige11月13日
暂无贡献等级
xmjiangbin11月13日
最代码贡献等级说明
hackxhao11月13日
最代码贡献等级说明
hwk_12311月13日
最代码贡献等级说明
程序猿全敏 LV311月13日
最代码贡献等级说明
willian111月13日
暂无贡献等级
小王wang11月13日
最代码贡献等级说明
Watson11月13日
最代码贡献等级说明
wkshitc11月13日
最代码贡献等级说明
nsq000611月13日
最代码贡献等级说明
Smail_ LV311月13日
最代码贡献等级说明
顶部客服微信二维码底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友