open-feign自定义反序列化decoder

简介: open-feign自定义反序列化decoder

人受谏,则圣。木受绳,则直。金就砺,则利。——孔子

主要是解决map类型擦除的问题,GlobalResponse继承了Map

代码如下:

import cn.hutool.core.util.TypeUtil;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import feign.RequestTemplate;
import feign.Response;
import feign.Util;
import feign.codec.DecodeException;
import feign.codec.Decoder;
import feign.codec.EncodeException;
import feign.codec.Encoder;
import jakarta.annotation.Resource;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.context.annotation.Bean;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;    
    @Bean
    public Decoder feignDecoder() {
        return (response, type) -> {
            if (response.status() == 404 || response.status() == 204) {
                return Util.emptyValueOf(type);
            }
            if (response.body() == null) {
                return null;
            }
            if (byte[].class.equals(type)) {
                return Util.toByteArray(response.body().asInputStream());
            }
            Response.Body body = response.body();
            if (String.class.equals(type)) {
                return Util.toString(body.asReader(Util.UTF_8));
            }
            if (GlobalResponse.class.equals(type)) {
                return objectMapper.readValue(body.asInputStream(), GlobalResponse.class);
            }
            if (!(type instanceof ParameterizedType)) {
                throw notSupportDecode(response, type);
            }
            ParameterizedType parameterizedType = TypeUtil.toParameterizedType(type);
            if (!(GlobalResponse.class.equals(parameterizedType.getRawType()))) {
                return objectMapper.readValue(body.asInputStream(), new TypeReference<>() {
                    @Override
                    public Type getType() {
                        return type;
                    }
                });
            }
            JsonNode jsonNode = objectMapper.readTree(body.asInputStream());
          GlobalResponsese<?> res = objectMapper.treeToValue(jsonNoGlobalResponseonse.class);
            JsonNode dataNode = jsonNodGlobalResponsesponse.DATA);
            if (dataNode.isNull()) {
                return res;
            }
            Object data = objectMapper.readValue(dataNode.toString(), new TypeReference<>() {
                @Override
                public Type getType() {
                    return TypeUtil.getTypeArgument(type);
                }
            });
            res.setData(data);
            return res;
        };
    }
相关文章
|
7月前
|
Java
LocalDateTime的全局自定义序列化
LocalDateTime的全局自定义序列化
|
7月前
|
消息中间件 存储 负载均衡
Kafka【付诸实践 01】生产者发送消息的过程描述及设计+创建生产者并发送消息(同步、异步)+自定义分区器+自定义序列化器+生产者其他属性说明(实例源码粘贴可用)【一篇学会使用Kafka生产者】
【2月更文挑战第21天】Kafka【付诸实践 01】生产者发送消息的过程描述及设计+创建生产者并发送消息(同步、异步)+自定义分区器+自定义序列化器+生产者其他属性说明(实例源码粘贴可用)【一篇学会使用Kafka生产者】
504 4
|
2月前
|
JSON 前端开发 数据格式
前端的全栈之路Meteor篇(五):自定义对象序列化的EJSON介绍 - 跨设备的对象传输
EJSON是Meteor框架中扩展了标准JSON的库,支持更多数据类型如`Date`、`Binary`等。它提供了序列化和反序列化功能,使客户端和服务器之间的复杂数据传输更加便捷高效。EJSON还支持自定义对象的定义和传输,通过`EJSON.addType`注册自定义类型,确保数据在两端无缝传递。
|
2月前
|
消息中间件 存储 Java
大数据-58 Kafka 高级特性 消息发送02-自定义序列化器、自定义分区器 Java代码实现
大数据-58 Kafka 高级特性 消息发送02-自定义序列化器、自定义分区器 Java代码实现
60 3
|
2月前
|
消息中间件 存储 分布式计算
大数据-61 Kafka 高级特性 消息消费02-主题与分区 自定义反序列化 拦截器 位移提交 位移管理 重平衡
大数据-61 Kafka 高级特性 消息消费02-主题与分区 自定义反序列化 拦截器 位移提交 位移管理 重平衡
26 1
|
6月前
|
JSON Java 数据格式
实现自定义序列化和反序列化控制的5种方式
实现自定义序列化和反序列化控制的5种方式
|
6月前
|
存储 分布式计算 Hadoop
MapReduce编程模型——自定义序列化类实现多指标统计
MapReduce编程模型——自定义序列化类实现多指标统计
55 0
|
7月前
|
消息中间件 分布式计算 Kafka
硬核!Apache Hudi中自定义序列化和数据写入逻辑
硬核!Apache Hudi中自定义序列化和数据写入逻辑
165 1
|
7月前
open-feign自定义反序列化decoder
open-feign自定义反序列化decoder
345 0
|
1月前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。