Smail_
2017-11-13 09:13:26
Springboot resttemplate之fastjon替换jackson以及getForObject请求时添加header的解决办法
Springboot很好用!
好用的同时总是少不了一些坑,或许我是才接触没多久的缘故吧!
1.resttemplate fastjson替换jackson
fastjson是国人的骄傲,符合国人的使用习惯。jackson的时间格式化坑:
网上有解决办法,但是我项目的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(); } }
两个问题解决!
评论
最近浏览
装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日