记一次SpringCloud Feign调用默认json解析器的bug

555 阅读1分钟

问题简述

简单来说,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;
    }
}