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日





