美文网首页
Spring Cloud Feign 配置 FastJson

Spring Cloud Feign 配置 FastJson

作者: Devon_King | 来源:发表于2018-11-02 15:07 被阅读0次

如今,越来越多的Spring MVC项目都选择使用FastJson做为Json解析框架,并且都会添加类似如下配置以支持FastJson:

@Configuration
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {

    @Override
    public void configureMessageConverters(
            List<HttpMessageConverter<?>> converters) {
        FastJsonHttpMessageConverter converter =
                new FastJsonHttpMessageConverter();

        List<MediaType> supportedMediaTypes = new ArrayList<MediaType>();
        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);
        converters.add(converter);
    }
}

但是,在使用Feign的Spring Cloud微服务项目中,要特别注意需要为Feign单独配置FastJson,因为Feign并不共用Spring MVC的消息转换器链,而且它默认使用的是Jackson Json解析库。这会导致混乱,甚至出现序列化/反序列化错误。

举个例子:
Bean的属性名与Json的属性名不一样,使用@JSONField()注解做转换。

public class Bean {

    @JSONField(name = "json_name")
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

但是,这个注解只有FastJson认得,Jackson并不认。所以在Feign将Bean转成Json的时候,将把name作为key名称输出(而我期望的时候,输出json_name的key名称),导致在Feign的服务端,以Spring MVC方式接收的时候,FastJson由于找不到json_name而不能正确给Bean的name属性赋值。

解决办法就是给Feign也添加FastJson的支持,如下:

@Configuration
public class FeignConfig {

    @Bean
    public Encoder feignEncoder() {
        return new SpringEncoder(feignHttpMessageConverter());
    }

    private ObjectFactory<HttpMessageConverters> feignHttpMessageConverter() {
        final HttpMessageConverters httpMessageConverters =
                new HttpMessageConverters(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;
    }

}

相关文章

网友评论

      本文标题:Spring Cloud Feign 配置 FastJson

      本文链接:https://www.haomeiwen.com/subject/mrhcxqtx.html