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;
        };
    }
相关文章
|
2月前
|
Java
LocalDateTime的全局自定义序列化
LocalDateTime的全局自定义序列化
|
2月前
|
消息中间件 存储 负载均衡
Kafka【付诸实践 01】生产者发送消息的过程描述及设计+创建生产者并发送消息(同步、异步)+自定义分区器+自定义序列化器+生产者其他属性说明(实例源码粘贴可用)【一篇学会使用Kafka生产者】
【2月更文挑战第21天】Kafka【付诸实践 01】生产者发送消息的过程描述及设计+创建生产者并发送消息(同步、异步)+自定义分区器+自定义序列化器+生产者其他属性说明(实例源码粘贴可用)【一篇学会使用Kafka生产者】
363 4
|
23天前
|
JSON Java 数据格式
实现自定义序列化和反序列化控制的5种方式
实现自定义序列化和反序列化控制的5种方式
|
1月前
|
存储 分布式计算 Hadoop
MapReduce编程模型——自定义序列化类实现多指标统计
MapReduce编程模型——自定义序列化类实现多指标统计
18 0
|
2月前
|
消息中间件 分布式计算 Kafka
硬核!Apache Hudi中自定义序列化和数据写入逻辑
硬核!Apache Hudi中自定义序列化和数据写入逻辑
84 1
|
2月前
open-feign自定义反序列化decoder
open-feign自定义反序列化decoder
228 0
|
10月前
|
缓存 NoSQL Java
SpringBoot自定义redisTemplate的key和value的序列化方式
SpringBoot自定义redisTemplate的key和value的序列化方式
127 0
|
12月前
|
Python
【Django学习】(九)自定义校验器_单字段_多字段校验_模型序列化器类
【Django学习】(九)自定义校验器_单字段_多字段校验_模型序列化器类
|
PHP
PHP:laravel日期序列化自定义默认日期格式
PHP:laravel日期序列化自定义默认日期格式
199 0
|
19天前
|
存储 Java
JaveSE—IO流详解:对象输入输出流(序列化及反序列化)
JaveSE—IO流详解:对象输入输出流(序列化及反序列化)