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;
        };
    }
相关文章
|
6月前
|
Java
LocalDateTime的全局自定义序列化
LocalDateTime的全局自定义序列化
|
6月前
|
消息中间件 存储 负载均衡
Kafka【付诸实践 01】生产者发送消息的过程描述及设计+创建生产者并发送消息(同步、异步)+自定义分区器+自定义序列化器+生产者其他属性说明(实例源码粘贴可用)【一篇学会使用Kafka生产者】
【2月更文挑战第21天】Kafka【付诸实践 01】生产者发送消息的过程描述及设计+创建生产者并发送消息(同步、异步)+自定义分区器+自定义序列化器+生产者其他属性说明(实例源码粘贴可用)【一篇学会使用Kafka生产者】
473 4
|
11天前
|
JSON 前端开发 数据格式
前端的全栈之路Meteor篇(五):自定义对象序列化的EJSON介绍 - 跨设备的对象传输
EJSON是Meteor框架中扩展了标准JSON的库,支持更多数据类型如`Date`、`Binary`等。它提供了序列化和反序列化功能,使客户端和服务器之间的复杂数据传输更加便捷高效。EJSON还支持自定义对象的定义和传输,通过`EJSON.addType`注册自定义类型,确保数据在两端无缝传递。
|
27天前
|
消息中间件 存储 Java
大数据-58 Kafka 高级特性 消息发送02-自定义序列化器、自定义分区器 Java代码实现
大数据-58 Kafka 高级特性 消息发送02-自定义序列化器、自定义分区器 Java代码实现
32 3
|
26天前
|
消息中间件 存储 分布式计算
大数据-61 Kafka 高级特性 消息消费02-主题与分区 自定义反序列化 拦截器 位移提交 位移管理 重平衡
大数据-61 Kafka 高级特性 消息消费02-主题与分区 自定义反序列化 拦截器 位移提交 位移管理 重平衡
18 1
|
5月前
|
JSON Java 数据格式
实现自定义序列化和反序列化控制的5种方式
实现自定义序列化和反序列化控制的5种方式
|
5月前
|
存储 分布式计算 Hadoop
MapReduce编程模型——自定义序列化类实现多指标统计
MapReduce编程模型——自定义序列化类实现多指标统计
40 0
|
6月前
|
消息中间件 分布式计算 Kafka
硬核!Apache Hudi中自定义序列化和数据写入逻辑
硬核!Apache Hudi中自定义序列化和数据写入逻辑
148 1
|
6月前
open-feign自定义反序列化decoder
open-feign自定义反序列化decoder
308 0
|
8天前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。