问题简述
简单来说,SpringCloud的Feign远程调用与SpringMVC没有采取同步措施,默认使用的是jackson进行解析
而我在SpringMVC中将json解析器改完了了fastjson,因此在远程调用时发生了解析错误的现象
预计结果应该为
{
"statusCode": 0,
"statusMsg": "string",
"videoMsgList": [
{
"commentCount": 0,
"coverUrl": "string",
"favoriteCount": 0,
"id": 0,
"isFavorite": true,
"playUrl": "string",
"title": "string",
"userMsg": {
"follow": true,
"followCount": 0,
"followerCount": 0,
"id": 0,
"username": "string"
}
}
]
}
实际却为,即"videoMsgList"字段没有获取到,原因是使用了fastjson的@JSONField注解修改了字段名
{
"statusCode": 0,
"statusMsg": "string",
}
解决方案
在配置类中添加以下配置
@Configuration
public class FeignConfig {
@Bean
Logger.Level feignLoggerLevel() {
//这里记录所有,根据实际情况选择合适的日志level
return Logger.Level.FULL;
}
@Bean
public Encoder feignEncoder() {
return new SpringEncoder(feignHttpMessageConverter());
}
@Bean
public Decoder feignDecoder() {
return new SpringDecoder(feignHttpMessageConverter());
}
/**
* 设置解码器为fastjson
*
* @return
*/
private ObjectFactory<HttpMessageConverters> feignHttpMessageConverter() {
final HttpMessageConverters httpMessageConverters = new HttpMessageConverters(this.getFastJsonConverter());
return () -> httpMessageConverters;
}
private FastJsonHttpMessageConverter getFastJsonConverter() {
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
List<MediaType> supportedMediaTypes = new ArrayList<>();
MediaType mediaTypeJson = MediaType.valueOf(MediaType.APPLICATION_JSON_UTF8_VALUE);
supportedMediaTypes.add(mediaTypeJson);
converter.setSupportedMediaTypes(supportedMediaTypes);
FastJsonConfig config = new FastJsonConfig();
config.getSerializeConfig().put(JSON.class, new SwaggerJsonSerializer());
config.setSerializerFeatures(SerializerFeature.DisableCircularReferenceDetect);
converter.setFastJsonConfig(config);
return converter;
}
}