修改Feign数据解析,由jackson改为fastjson,同时解决fastjson中Content-Type问题

https://my.oschina.net/u/3419586/blog/2964047

 

背景:

在用Feign Client 接口调用,由于jackson对null等特殊值处理存在异常,故改用fastjson解析数据

 

操作步骤:

1.增加文件FeignConfig,注入Bean,修改默认Feign默认的解析方式

2.由于fastjson1.2.28后,增加了对Content-type验证,故添加多种MediaType

@Configuration
public class FeignConfig {

    @Bean
    public ResponseEntityDecoder feignDecoder() {
        HttpMessageConverter fastJsonConverter = createFastJsonConverter();
        ObjectFactory<HttpMessageConverters> objectFactory = () -> new HttpMessageConverters(fastJsonConverter);
        return new ResponseEntityDecoder(new SpringDecoder(objectFactory));
    }

    @Bean
    public SpringEncoder feignEncoder(){
        HttpMessageConverter fastJsonConverter = createFastJsonConverter();
        ObjectFactory<HttpMessageConverters> objectFactory = () -> new HttpMessageConverters(fastJsonConverter);
        return new SpringEncoder(objectFactory);
    }

    private HttpMessageConverter createFastJsonConverter() {

        //创建fastJson消息转换器
        FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();

        //升级最新版本需加=============================================================
        List<MediaType> supportedMediaTypes = new ArrayList<>();
        supportedMediaTypes.add(MediaType.APPLICATION_JSON);
        supportedMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
        supportedMediaTypes.add(MediaType.APPLICATION_ATOM_XML);
        supportedMediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
        supportedMediaTypes.add(MediaType.APPLICATION_OCTET_STREAM);
        supportedMediaTypes.add(MediaType.APPLICATION_PDF);
        supportedMediaTypes.add(MediaType.APPLICATION_RSS_XML);
        supportedMediaTypes.add(MediaType.APPLICATION_XHTML_XML);
        supportedMediaTypes.add(MediaType.APPLICATION_XML);
        supportedMediaTypes.add(MediaType.IMAGE_GIF);
        supportedMediaTypes.add(MediaType.IMAGE_JPEG);
        supportedMediaTypes.add(MediaType.IMAGE_PNG);
        supportedMediaTypes.add(MediaType.TEXT_EVENT_STREAM);
        supportedMediaTypes.add(MediaType.TEXT_HTML);
        supportedMediaTypes.add(MediaType.TEXT_MARKDOWN);
        supportedMediaTypes.add(MediaType.TEXT_PLAIN);
        supportedMediaTypes.add(MediaType.TEXT_XML);
        fastConverter.setSupportedMediaTypes(supportedMediaTypes);

        //创建配置类
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        //修改配置返回内容的过滤
        //WriteNullListAsEmpty  :List字段如果为null,输出为[],而非null
        //WriteNullStringAsEmpty : 字符类型字段如果为null,输出为"",而非null
        //DisableCircularReferenceDetect :消除对同一对象循环引用的问题,默认为false(如果不配置有可能会进入死循环)
        //WriteNullBooleanAsFalse:Boolean字段如果为null,输出为false,而非null
        //WriteMapNullValue:是否输出值为null的字段,默认为false
        fastJsonConfig.setSerializerFeatures(
                SerializerFeature.DisableCircularReferenceDetect,
                SerializerFeature.WriteMapNullValue
        );
        fastConverter.setFastJsonConfig(fastJsonConfig);

        return fastConverter;
    }
}

 

实际调用链:

1.通过Feign调用接口

2.默认进入

org.springframework.http.converter.AbstractHttpMessageConverter 的 writeInternal 方法

3.FastJson实现该方法,进行数据转换处理

com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter 中的 write 方法

验证结束

### 如何在 OpenFeign 中使用 FastJSON 进行序列化与反序列化 要在 OpenFeign 中使用 FastJSON 来替代默认的 Jackson 序列化器和反序列化器,可以通过自定义 `Decoder` 和 `Encoder` 来实现。以下是详细的说明: #### 自定义 Encoder 配置 通过创建一个基于 FastJSON 的编码器来处理请求体的序列化操作。 ```java import com.alibaba.fastjson.JSON; import feign.Feign; import feign.codec.Encoder; import feign.reflect.DataConverter; public class FastJsonEncoder implements Encoder { private final DataConverter dataConverter = new DataConverter.Default(); @Override public void encode(Object object, Type bodyType, RequestTemplate template) { String json = JSON.toJSONString(object); template.body(json); // 将对象转换为 JSON 字符串并设置到请求体中 } } ``` 此部分实现了 Feign 的 `Encoder` 接口,并利用 FastJSON 提供的方法将 Java 对象转为 JSON 字符串[^1]。 #### 自定义 Decoder 配置 同样可以构建一个解码器用于响应数据解析过程。 ```java import com.alibaba.fastjson.TypeReference; import com.alibaba.fastjson.JSON; import feign.Response; import feign.Util; import feign.codec.Decoder; import java.io.IOException; import java.lang.reflect.Type; public class FastJsonDecoder implements Decoder { @Override public Object decode(Response response, Type type) throws IOException, DecodeException { if (response.status() >= 400 && response.status() <= 599){ throw new RuntimeException("HTTP Status Code: "+response.status()); } String responseBody = Util.toString(response.body().asReader()); try{ if(type instanceof Class<?>){ return JSON.parseObject(responseBody,(Class<?>)type); }else{ return JSON.parseObject(responseBody,new TypeReference<Object>(type){}); } }catch(Exception e){ throw new RuntimeException(e.getMessage(),e); } } } ``` 上述代码片段展示了如何借助 FastJSON 解析 HTTP 响应中的 JSON 数据至指定的目标型[^3]。 #### 整合配置 最后一步就是把这些组件装配起来,在启动或者配置文件里完成初始化工作。 ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class FeignConfig { @Bean public Encoder feignEncoder(){ return new FastJsonEncoder(); } @Bean public Decoder feignDecoder(){ return new FastJsonDecoder(); } } ``` 这样就完成了整个流程的设计与实施,使得 OpenFeign 能够支持 FastJSON 的序列化/反序列化的功能需求[^2]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值