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头像
最近浏览
装141516 2021年8月27日
暂无贡献等级
princemiaomiao  LV1 2020年1月3日
速水重道2019  LV1 2019年12月10日
tdxywxy1  LV1 2019年12月9日
huberycheng  LV1 2019年8月4日
modesty  LV1 2019年6月17日
lvly_1988 2019年6月5日
暂无贡献等级
yulu080513  LV1 2019年5月31日
warrior929 2019年5月10日
暂无贡献等级
wangchuanyin  LV8 2019年2月16日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友