Fegin 中统一处理调用的结果

news2024/9/28 7:18:36

背景

项目中,微服务环境下,有很多时候,都需要调用其他服务,而且其他服务基本上都有一个骨架类(如下图),为了不用每次调用都去判断是否成功,所以需要统一处理接口返回的结果 

 

思考

跟踪代码发现,Fegin中有个数据解析器(如下图),默认是使用SpringDecoder实现,我们需要自己封装该类,将逻辑替换

 思路

由此,就展开了,需要自定义解析器,并配置解析器生效的思考,如果这么的路走通了,就能统一处理数据了

骨架类 

package com.a.mybatis.common.response;

import java.io.Serializable;
import java.util.Objects;

public final class ResponseData<T> implements Serializable {
    private static final long serialVersionUID = 7824278330465676943L;
    public static final Integer ERROR = 0;
    public static final Integer SUCCESS = 1;
    private static final String ERROR_MSG = "服务器错误";
    private static final String SUCCESS_MSG = "success";
    private Integer code;
    private String msg;
    private T data;
}

自定义解析类 

package com.a.common.feign.config;

import com.a.mybatis.common.exception.CustomMessageException;
import com.a.mybatis.common.response.ResponseData;
import com.alibaba.fastjson2.JSON;
import feign.FeignException;
import feign.Response;
import feign.codec.Decoder;
import org.springframework.cloud.openfeign.support.SpringDecoder;
import org.springframework.util.Assert;

import java.io.IOException;
import java.lang.reflect.Type;
import java.nio.charset.StandardCharsets;


public class MyDataDecoder implements Decoder {
    private final SpringDecoder decoder;

    public MyDataDecoder(SpringDecoder decoder) {
        this.decoder = decoder;
    }

    @Override
    public Object decode(Response response, Type type) throws IOException, FeignException {
        ResponseData<?> responseData = JSON.parseObject(response.body().asReader(StandardCharsets.UTF_8), ResponseData.class);
        Assert.notNull(responseData, "feign invoke failed");
        if (ResponseData.SUCCESS.equals(responseData.getCode())) {
            return responseData.getData();
        }
        throw new CustomMessageException("数据解析失败");
    }
}

 配置类

package com.a.common.feign.config;

import feign.codec.Decoder;
import feign.optionals.OptionalDecoder;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.cloud.openfeign.support.HttpMessageConverterCustomizer;
import org.springframework.cloud.openfeign.support.ResponseEntityDecoder;
import org.springframework.cloud.openfeign.support.SpringDecoder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

 
@Configuration
public class FeignConfig {

    /**
     * 自定义解析器
     *
     * @param msgConverters 信息转换
     * @param customizers   自定义参数
     * @return 解析器
     */
    @Bean
    public Decoder decoder(ObjectFactory<HttpMessageConverters> msgConverters, ObjectProvider<HttpMessageConverterCustomizer> customizers) {
        return new OptionalDecoder((new ResponseEntityDecoder(new MyDataDecoder(new SpringDecoder(msgConverters, customizers)))));
    }
}

 FeginCilent

package com.a.common.feign;

import com.a.common.feign.config.FeignConfig;
import io.swagger.annotations.ApiOperation;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;
import java.util.Map;


@Order(Ordered.HIGHEST_PRECEDENCE)
@Component
@FeignClient(value = "data-accessor-server", url = "http://192.168.0.1:8080", configuration = FeignConfig.class)
public interface DataAccessorFeignClient {
    /**
     * 获取学生的编号
     *
     * @param id 唯一主键
     * @return 学生编号
     */
    @GetMapping(value = "query/student/no")
    @ApiOperation(value = "获取学生的编号")
    String getStudentNo(Long id);
}

 访问类

package com.a.data.controller;

import com.a.common.feign.DataAccessorFeignClient;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;


@RestController
@Api(tags = "Tests-测试-相关接口")
@RequestMapping(value = "/test/test", produces = MediaType.APPLICATION_JSON_VALUE)
public class TestController {
    @Resource
    private DataAccessorFeignClient dataAccessorFeignClient;

    @GetMapping("")
    @ApiOperation(value = "test-测试")
    public Object test(Long id) {
        return dataAccessorFeignClient.getStudentNo(id);
    }
}

此时可以愉快的进行接口调用,而又不需要做多余的判断了 

通用位置配置 

如果把对应的FeignClient放在公共位置,需要对该类是否使用进行配置,能满足该功能的官方注解有两个

1.@ConditionalOnExpression -根据表达式确定是否满足使用
2.@ConditionalOnProperty -根据having值确定是否满足使用

使用@ConditionalOnExpression,发现没有生效,跟踪代码发现,是因为该注解的生效优先级比较低,而 @ConditionalOnProperty 优先级比较高,导致@EnableFeignClients扫描的时候,该注解还没执行,所以要么是使用@ConditionalOnProperty注解,要么是将优先级问题解决掉

 

 记录被查

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/671333.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Seata Saga 模式理论学习、生产级使用示例搭建及注意事项(二) | Spring Cloud58

一、前言 通过以下系列章节&#xff1a; docker-compose 实现Seata Server高可用部署 | Spring Cloud 51 Seata AT 模式理论学习、事务隔离及部分源码解析 | Spring Cloud 52 Spring Boot集成Seata利用AT模式分布式事务示例 | Spring Cloud 53 Seata XA 模式理论学习、使用…

Dubbo服务发现原理

一、Dubbo服务发现设计 Dubbo提供的是一种Client-Based的服务发现机制&#xff0c;依赖第三方注册中心组件来协调服务发现过程&#xff0c;支持常用的注册中心如Nacos、Connsul、Zookeeper等 Dubbo服务发现机制的基本工作原理图&#xff1a; 服务发现包含提供者、消费者和注册…

MySQL 被 PG 干翻了。。

出品 | OSC开源社区&#xff08;ID&#xff1a;oschina2013) Stack Overflow 发布了 2023 年开发者调查报告&#xff0c;据称共计超过 9 万名开发者参与了此次调查。 完整报告包含了受访开发者画像&#xff0c;以及关于开发技术、AI、职业、社区等方面的内容。本文主要介绍关于…

ICC2: 工具是如何控制局部利用率的?

分析congestion map时不难发现,route congestion高的地方局部利用率往往要比周围低,这时疑问就来了,既然standard cell的分布不是均匀的,那局部再降一降彻底解决congestion问题不好嘛?工具是如何控制这种congestion driven的行为的呢? 在place_opt以及clock_opt的log里都…

Apache Atlas高级搜索语法示例

from hive_table;hive_table from hive_table where name xxx or name yyy from hive_table where name ["xxx", "yyy"] from hive_table where name LIKE *_xxx hive_db where name like "???dm?*" hive_column where table.name …

Dcat Admin 2 集成富文本编辑器 wangEditor 5

由于默认的 TinyMCE 个人不是很喜欢&#xff0c;所以替换成国产的富文本编辑器 wangEditor Dcat Admin 文档示例&#xff1a;集成富文本编辑器 wangEditor 但是官方的示例是针对 wangEditor 4 编写的&#xff0c;这里仅指出对版本 5 的差异部分 获取文件 将以下三个文件保存…

快码住! 结构体内存对齐(计算结构体大小) 干货满满!

文章目录 结构体内存对齐规则结构体大小计算为什么存在内存对齐&#xff1f;设计结构体的技巧如何修改默认对齐数&#xff1f; 结构体内存对齐规则 我们知道&#xff0c;整型变量有自己的大小&#xff0c;浮点型变量有自己的大小&#xff0c;数组也有自己的大小&#xff0c;那…

血流动力学与血压(一)--平均动脉压

平均动脉压 在血管血流动力学研究中&#xff0c;心血管系统通常被认为是一个简单的液压回路&#xff0c;由泵&#xff08;心脏&#xff09;组成&#xff0c;泵&#xff08;心脏&#xff09;有节奏地活动&#xff08;收缩 --> 舒张 --> 收缩 --> 舒张 --> 收缩…&am…

中国一重集中采购平台的建设经历和亮点

中国一重前身为第一重型机器厂&#xff0c;是“一五”期间建设156项重点工程项目之一&#xff0c;始建于1954年&#xff0c;是中央管理的涉及国家安全和国民经济命脉的国有重要骨干企业之一&#xff0c;是国家创新型试点企业、国家高新技术企业&#xff0c;拥有国家级企业技术中…

java 校园管理系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 JSP 校园管理系统 是一套完善的系统源码&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;以及相应配套的设计文档&#xff0c;系统主要采用B/S模式开发。 研究的基本内容是基于Web的校园管理系统&…

访问不到阿里云服务器端口

这里前台在主机上 然后访问服务器上的node后台 一直访问不到 不能连入阿里云服务器后台 连不上公网ip端口 解决方案 登录阿里云 进入云服务器 2、管理控制台 3、网络与安全——>安全组 4、安全组里面点击配置规则 5、手动添加 即可

《项目实战》构建SpringCloud alibaba项目(三、构建服务方子工程store-user-service)

系列文章目录 构建SpringCloud alibaba项目&#xff08;一、构建父工程、公共库、网关&#xff09; 构建SpringCloud alibaba项目&#xff08;二、构建微服务鉴权子工程store-authority-service&#xff09; 构建SpringCloud alibaba项目&#xff08;三、构建服务方子工程stor…

python学习——NumPy数值计算基础

目录 NumPy数值计算基础1.array创建数组及其属性2.其他创建方式3.数据类型及其转换4.生成随机数5.数组的索引和切片6.改变数组形态【案例】两个国家的数据方法一起来研究分析&#xff0c;同时保留国家的信息&#xff08;每条数据的国家来源&#xff09;&#xff0c;应该怎么办 …

《网络安全0-100》单钥加密体制

单钥加密体制 DES算法 DES属于对称密码算法中的分组加密(块加密)&#xff0c;和流密码相对应。DES算法将明文分为若干个64位块(不足补充)&#xff0c;秘钥为56位(8位校验位)。DES算法流程图如下 接下来&#xff0c;进行DES算法关键步骤的逐步解析&#xff1a; IP置换 IP置换…

Python学习——数据分组统计、分组运算及透视

目录 1 数据分组统计 groupby1.1 按照单列进行分组统计df.groupby(列名).count()1.2 按照多列进行分组统计 df.groupby([列名1,列名2]).count()1.3 分组填充缺失值 df.groupby(需填充列名).apply(lambda x:x.fillna(x.mean())) 2 分组运算 agg2.1 传入标准函数 df.groupby(班级…

机器学习之KNN(K近邻)算法

1 KNN算法介绍 KNN算法又叫做K近邻算法&#xff0c;是众多机器学习算法里面最基础入门的算法。KNN算法是最简单的分类算法之一&#xff0c;同时&#xff0c;它也是最常用的分类算法之一。KNN算法是有监督学习中的分类算法&#xff0c;它看起来和Kmeans相似&#xff08;Kmeans是…

乱七八糟知识点

知识点汇总 看一个文件的前n行、指定行、末n行idea 创建快捷测试文件Mac版 pycharm 快捷键ideaMac 终端MySQL 安装完&#xff0c;初始密码一般存在vim操作搜索引擎 看一个文件的前n行、指定行、末n行 # 先准备一个文件 ➜ tmp cat a.txt 001 002 003 004 005 006# 查看前2行…

不变的是需求,变化的是解决方法和工具:探讨iPaaS与ESB的差异

在企业数字化转型过程中&#xff0c;企业需要面临日益复杂的业务和数据集成挑战。为了应对这些挑战&#xff0c;需要借助适当的解决方法和工具来实现系统间的通信和数据传输。在这方面&#xff0c;iPaaS&#xff08;Integration Platform as a Service&#xff09;和ESB&#x…

STM32外设系列—OLED

文章目录 一、OLED简介二、数据手册分析2.1 供电电压2.2 引脚定义2.3 原理图介绍2.4 数据手册程序 三、IIC通信3.1 什么是IIC3.2 IIC通信协议3.3 IIC主从通信过程3.3.1 写入数据3.3.2 读取数据 四、OLED程序设计4.1 OLED初始化4.2 OLED控制函数编写4.2.1 OLED显示开/关程序4.2.…

ECCV2022 多目标跟踪(MOT)汇总

一、《Towards Grand Unification of Object Tracking》 作者: Bin Yan1⋆, Yi Jiang2,†, Peize Sun3, Dong Wang1,†,Zehuan Yuan2, Ping Luo3, and Huchuan Lu School of Information and Communication Engineering, Dalian University of Technology, China 2 ByteDance …