FeignClient注解中各种属性详解

2023-11-12

一、value,name

这两个属性的作用是一样的,如果没有配置url,那么配置的值将作为服务的名称,用于服务的发现,反之只是一个名称。

注意:这里写的是你要调用的那个服务的名称,而不是你自己的那个服务的名称。另外,如果同一个工程中出现两个接口使用一样的服务名称会报错。原因是Client名字注册到容器中重复了。

Description:
The bean 'optimization-user.FeignClientSpecification', defined in null, could not be registered. A bean with that name has already been defined in null and overriding is disabled.
Action:
Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true

FeignCilent注解注入到容器中底层源码默认首先使用的是属性value的值作为bean的名称注入到Spring容器中。

String name = getClientName(attributes);

registerClientConfiguration(registry, name,
attributes.get("configuration"));
private String getClientName(Map<String, Object> client) {
    if (client == null) {
      return null;
    }
    String value = (String) client.get("contextId");
    if (!StringUtils.hasText(value)) {
      value = (String) client.get("value");
    }
    if (!StringUtils.hasText(value)) {
      value = (String) client.get("name");
    }
    if (!StringUtils.hasText(value)) {
      value = (String) client.get("serviceId");
    }
    if (StringUtils.hasText(value)) {
      return value;
    }


    throw new IllegalStateException("Either 'name' or 'value' must be provided in @"
        + FeignClient.class.getSimpleName());
  }

 

二、contextId

想要解决一种出现的问题有两种方式,

一、在配置文件中加入下面的配置,作用是允许出现beanName一样的BeanDefinition,可以解决一种报错问题。

spring.main.allow-bean-definition-overriding=true

 二、每一个Client手动指定不同的ContextId,也可以解决这和问题。

通过一种源码可以知道,如果配置了contextId这个属性,就会采用contextId作为bean的名称注入进容器中,如果没有配置就会去找value然后是name,最后是serviceId(此属性yijing废弃)。

另外在注册FeignClient中,这个属性还会作为Client别名的一部分,如果配置了qualifier,会有限使用qualifier作为别名。

// 拼接别名
    String alias = contextId + "FeignClient";
    AbstractBeanDefinition beanDefinition = definition.getBeanDefinition();


    boolean primary = (Boolean) attributes.get("primary"); // has a default, won't be
                                // null


    beanDefinition.setPrimary(primary);

    // 配置了qualifier优先用qualifier
    String qualifier = getQualifier(attributes);
    if (StringUtils.hasText(qualifier)) {
      alias = qualifier;
    }


    BeanDefinitionHolder holder = new BeanDefinitionHolder(beanDefinition, className,
        new String[] { alias });
    BeanDefinitionReaderUtils.registerBeanDefinition(holder, registry);

三、url

用于配置指定的地址,相当于使用http的形式直接请求这个服务,不经过注册中心。如果配置了这个属性和,name属性(通过注册中心调用目标服务)将会被覆盖,不会通过配置中心调用服务。

四、configuration

这个属性是配置Feign的配置类,在配置类中可以定义Feign的Encoder、Decoder、loglevel、contract、鉴权信息等。

public class FeignConfiguration {
    @Bean
    public Logger.Level getLoggerLevel() {
        return Logger.Level.FULL;
    }
    @Bean
    public BasicAuthRequestInterceptor basicAuthRequestInterceptor() {
        return new BasicAuthRequestInterceptor("user", "password");
    }

    @Bean
    public CustomRequestInterceptor customRequestInterceptor() {
        return new CustomRequestInterceptor();
    }
    // Contract,feignDecoder,feignEncoder.....
}

 使用如下:

@FeignClient(value = "optimization-user", configuration = FeignConfiguration.class)

五、fallback /fallbackFactory

定义服务降级、容错的处理类。fallback必须实现使用了FeignClient注解中的接口,否者无法实现兜底。

两种方式:

一、直接实现对应的接口

@Component
public class UserRemoteClientFallback implements UserRemoteClient {
    @Override
    public User getUser(int id) {
        return new User(0, "默认fallback");
    }

}

使用方式:

@FeignClient(value = "optimization-user", fallback = UserRemoteClientFallback.class)

这种就无法知道降级的具体原因

二、实现FallbackFactory接口

public class TestFeignFallback implements FallbackFactory<TestClient> {
    @Override
    public TestClient create(Throwable cause) {

        return new TestClient() {
            @Override
            public String callTest(String content,String auth) {
                log.error("call test  error:{}",JacksonUtil.parse2Str(cause)); 
                throw new BizException(PcReturnCode.REMOTE_TRANSFER_ERROR);
            }
        };
    }
}

这种就可以知道具体的错误原因 .

使用方式:

@FeignClient(value = "optimization-user", fallbackFactory = TestClient.class)

 六、path

定义了当前FeignClient访问接口时的同意前缀,比如接口地址是/user/test,/user/get,如果你定义了前缀user,那么方法方法路径上直接写/test或/get就可以了。

@FeignClient(name = "optimization-user", path="user")
public interface UserRemoteClient {

    @GetMapping("/get")
    public User getUser(@RequestParam("id") int id);
}

七、primary

该属性与@Primary注解功能类似,默认是true,放我们feign实现了fallback进行服务兜底后,由于兜底的类是实现了@FeignClient修饰的接口们也就意味着 FeignClient有多个相同的bean在Spring容器中,当我们使用@Autowired进行注入的时候,就会出现不知道注入那个。所以这个属性就生效了,ture表示这个属性的对象是优先级高的。

八、qualifier

qualifier对应的是@Qualifier注解,使用场景跟上面的primary关系很淡,一般场景直接@Autowired直接注入就可以了。

如果我们的Feign Client有fallback实现,默认@FeignClient注解的primary=true, 意味着我们使用@Autowired注入是没有问题的,会优先注入你的Feign Client。

如果把primary设置成false了,直接用@Autowired注入的地方就会报错,不知道要注入哪个对象。

解决方案很明显,你可以将primary设置成true即可,如果由于某些特殊原因,你必须得去掉primary=true的设置,这种情况下我们怎么进行注入,我们可以配置一个qualifier,然后使用@Qualifier注解进行注入,示列如下:

@FeignClient(name = "optimization-user", path="user", qualifier="userRemoteClient")
public interface UserRemoteClient {

    @GetMapping("/get")
    public User getUser(@RequestParam("id") int id);
}
@Autowired
@Qualifier("userRemoteClient")
private UserRemoteClient userRemoteClient;

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FeignClient注解中各种属性详解 的相关文章

  • Hibernate 挂起或引发延迟初始化,没有会话或会话已关闭

    我正在增强旧的 Spring Hibernate 应用程序 但我陷入困境 我有一种方法可以读取 3000 多行长的文件 每行都有一条记录 必须与数据库中的某些内容进行比较 然后必须将寄存器添加到数据库 多对多表 表和关系是 Branch h
  • HSQL - 识别打开连接的数量

    我正在使用嵌入式 HSQL 数据库服务器 有什么方法可以识别活动打开连接的数量吗 Yes SELECT COUNT FROM INFORMATION SCHEMA SYSTEM SESSIONS
  • Pig Udf 显示结果

    我是 Pig 的新手 我用 Java 编写了一个 udf 并且包含了一个 System out println 其中的声明 我必须知道在 Pig 中运行时该语句在哪里打印 假设你的UDF 扩展了 EvalFunc 您可以使用从返回的 Log
  • 在 Jar 文件中运行 ANT build.xml 文件

    我需要使用存储在 jar 文件中的 build xml 文件运行 ANT 构建 该 jar 文件在类路径中可用 是否可以在不分解 jar 文件并将 build xml 保存到本地目录的情况下做到这一点 如果是的话我该怎么办呢 Update
  • 如何更改javaFX中按钮的图像?

    我正在使用javaFX 我制作了一个按钮并为此设置了图像 代码是 Image playI new Image file c Users Farhad Desktop icons play2 jpg ImageView iv1 new Ima
  • 谷歌应用程序引擎会话

    什么是java应用程序引擎 默认会话超时 如果我们将会话超时设置为非常非常长的时间 会不会产生不良影响 因为谷歌应用程序引擎会话默认情况下仅存储在数据存储中 就像facebook一样 每次访问该页面时 会话仍然永远存在 默认会话超时设置为
  • Java 公历日历更改时区

    我正在尝试设置 HOUR OF DAY 字段并更改 GregorianCalendar 日期对象的时区 GregorianCalendar date new GregorianCalendar TimeZone getTimeZone GM
  • java.lang.IllegalStateException:应用程序 PagerAdapter 更改了适配器的内容,而没有调用 PagerAdapter#notifyDataSetChanged android

    我正在尝试使用静态类将值传递给视图 而不是使用意图 因为我必须传递大量数据 有时我会收到此错误 但无法找出主要原因是什么 Error java lang IllegalStateException The application s Pag
  • 从最终实体获取根证书和中间证书

    作为密码学的菜鸟 我每天都会偶然发现一些简单的事情 今天只是那些日子之一 我想用 bouncy castle 库验证 java 中的 smime 消息 我想我几乎已经弄清楚了 但此时的问题是 PKIXparameters 对象的构建 假设我
  • 将流转换为 IntStream

    我有一种感觉 我在这里错过了一些东西 我发现自己做了以下事情 private static int getHighestValue Map
  • 内部类的构造函数引用在运行时失败并出现VerifyError

    我正在使用 lambda 为内部类构造函数创建供应商ctx gt new SpectatorSwitcher ctx IntelliJ建议我将其更改为SpectatorSwitcher new反而 SpectatorSwitcher 是我正
  • 当 OnFocusChangeListener 应用于包装的 EditText 时,TextInputLayout 没有动画

    不能比标题说得更清楚了 我有一个由文本输入布局包裹的 EditText 我试图在 EditText 失去焦点时触发一个事件 但是 一旦应用了事件侦听器 TextInputLayout 就不再对文本进行动画处理 它只是位于 editText
  • Eclipse 选项卡宽度不变

    我浏览了一些与此相关的帖子 但它们似乎并不能帮助我解决我的问题 我有一个项目 其中 java 文件以 2 个空格的宽度缩进 我想将所有内容更改为 4 空格宽度 我尝试了 正确的缩进 选项 但当我将几行修改为 4 空格缩进时 它只是将所有内容
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 如何使用 jUnit 将测试用例添加到套件中?

    我有 2 个测试类 都扩展了TestCase 每个类都包含一堆针对我的程序运行的单独测试 如何将这两个类 以及它们拥有的所有测试 作为同一套件的一部分执行 我正在使用 jUnit 4 8 在 jUnit4 中你有这样的东西 RunWith
  • 专门针对 JSP 的测试驱动开发

    在理解 TDD 到底是什么之前 我就已经开始编写测试驱动的代码了 在没有实现的情况下调用函数和类可以帮助我以更快 更有效的方式理解和构建我的应用程序 所以我非常习惯编写代码 gt 编译它 gt 看到它失败 gt 通过构建其实现来修复它的过程
  • Cucumber 0.4.3 (cuke4duke) 与 java + maven gem 问题

    我最近开始为 Cucumber 安装一个示例项目 并尝试使用 maven java 运行它 我遵循了这个指南 http www goodercode com wp using cucumber tests with maven and ja
  • 包 javax.el 不存在

    我正在使用 jre6 eclipse 并导入 javax el 错误 包 javax el 不存在 javac 导入 javax el 过来 这不应该是java的一部分吗 谁能告诉我为什么会这样 谢谢 米 EL 统一表达语言 是 Java
  • 创建一个 JSON 对象以在 Spring Boot 测试中发布

    我想编写基本测试来使用 JSON 负载在 users URL 上执行 POST 请求来创建用户 我找不到如何将新对象转换为 JSON 到目前为止有这么多 这显然是错误的 但解释了目的 Test public void createUser
  • 如何将双精度/浮点四舍五入为二进制精度?

    我正在编写对浮点数执行计算的代码的测试 不出所料 结果很少是准确的 我想在计算结果和预期结果之间设置一个容差 我已经证实 在实践中 使用双精度 在对最后两位有效小数进行四舍五入后 结果始终是正确的 但是usually四舍五入最后一位小数后

随机推荐

  • ElasticSearch入门学习笔记(2)--------Kibana语法学习

    ElasticSearch的ResultFul风格 基于Rest命令说明 原文链接 基础测试 创建一个索引 put 索引名 类型名 文档id 请求体 可以再head里面看到里面多了一个test1 从下面的图中可以看到本质上就是往里面put了
  • 如何在两个相关泛型类之间创建类似子类型的关系

    本文正在参加 金石计划 瓜分6万现金大奖 哈喽大家好 我是阿Q 事情是这个样子的 对话中的截图如下 看了阿Q的解释 你是否也和 马小跳 一样存在疑问呢 请往 看 我们都知道在java中 只要是类型兼容 就可以将一种类型的对象分配给另一种类型
  • vmware启动报错0xc000007b 解决方式

    1 官网下载vmwre 最新版后安装 2 运行vmwre报错结果如下 解决方法 安装最新版本C 运行库 VisualC2022 64 86 64位操作系统安装VisualC2022 64 86 32未操作系统安装VisualC2022 86
  • 【华为OD统一考试B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • c++中的vector的用法

    参考博客 https blog csdn net msdnwolaile article details 52708144 基本用法 如下代码 include
  • Flutter Image图片显示

    目录 参数详解 代码示例 效果图 完整代码 使用资源图片前必做两个步骤 1 在根目录下创建子目录 子目录中创建2 0x和3 0x 也可以创建4 0x 5 0x 但是2 0和3 0是必须的 目录 在对应目录中添加对应分辨率图片 图1 2 打开
  • 2020笔记本性价比之王_2020十大笔记本电脑性价比排行(最新笔记本电脑推荐)...

    2020十大笔记本电脑性价比排行 最新笔记本电脑推荐 1 HP 惠普 战99 15 6英寸笔记本电脑 2 Acer 宏碁 墨舞P50 15 6英寸笔记本电脑 3 HONOR 荣耀 MagicBook Pro 16 1英寸笔记本电脑 4 AS
  • C++中的Unicode编码:wchar, UTF-8,UTF-16,UTF-32

    C 在C11标准中加入了对Unicode编码的支持 新增了wchar t char16 t char32 t内置数据类型 cout lt lt sizeof char lt lt endl cout lt lt sizeof wchar t
  • 上传新文件项目到svn上

    一 在之前有svn项目的文件夹中检出 这一步主要是为了获得svn的仓库地址 二 在一个之前有的svn项目里面右键tortoiseSvn gt 版本库浏览器 就会出现这样的界面 然后在这个界面里右键里选择加入文件夹 选择本地的文件夹就可以了
  • Python剪刀石头布

    这是以前刚刚开始学习python时自己编的第一个小游戏 很简单 分享给大家 import random 胜 0 负 0 平 0 while True 对方 str random randint 1 3 我方 input 请选择你的出拳 剪刀
  • [C]编译器对char数组声明的一个行为

    1 概述 如果使用char 来声明char数组 那么编译器会自动计算后面的字面量字符数 再加上一个空字符 作为它的长度 实际上这个数组最后一位被编译器强行加上了 0 include
  • VS里面关于.cpp文件与.cu文件混合编译问题---不要在.cpp文件声明核函数(__device__()和global__())

    原文出处 点击打开链接 不要在 cpp文件声明核函数 否则会报错 具体可以参考下面两个链接 http blog csdn net lingerlanlan article details 25063331 utm source tuicoo
  • 如何自己手动搭建一个RSS订阅机器人(rssbot),自己做一个RSS阅读器

    当你想RSS订阅一些自己感兴趣的博客 却又苦于免费的RSS阅读器广告很多时 可以自己借助Telegram机器人搭建一个RSS订阅机器人 本文老王介绍下如何搭建一个Telegram RSS订阅机器人 以及如何把RSS订阅机器人拖到Telegr
  • JAVA - 可变对象与不可变对象

    不可变对象在并发程序中比较有用 由于其状态无法改变 因此无法被线程的干扰损坏或者被视为不一致状态 基本概念 不可变对象 Immutable Objects 即对象一旦被创建它的状态 对象的数据 也即对象属性值 就不能改变 任何对它的改变都应
  • U3D Transform基本移动函数: 移动、旋转、缩放

    1 指定方向移动 移动速度 float TranslateSpeed 10f Vector3 forward 表示 向前 transform Translate Vector3 forward TranslateSpeed 2 全方向移动
  • Java 8新特性探究(十一)Base64详解

    2019独角兽企业重金招聘Python工程师标准 gt gt gt BASE64 编码是一种常用的字符编码 在很多地方都会用到 但base64不是安全领域下的加密解密算法 能起到安全作用的效果很差 而且很容易破解 他核心作用应该是传输数据的
  • 数字IC时钟

    目录 前言 1 时钟的概念与性质 2 时钟源 3 时钟管理模块 3 1 时钟门控 3 2 时钟分频 3 3 时钟切换 前言 时钟信号对于整个芯片的功能有着至关重要的作用 一旦芯片级的时钟信号质量不高 会导致许多不受控的异常bug 本人目前还
  • 数据库(第五版)课后习题答案

    仅供参考 有任何问题概不负责 请同学们谨慎参考 数据库系统概论第五版 答案 第1章 绪论 1 试述数据 数据库 数据库系统 数据库管理系统的概念 答 l 数据 Data 描述事物的符号记录称为数据 数据的种类有数字 文字 图形 图像 声音
  • inc指令是什么意思_工作台自动循环运动PLC控制指令与梯形图

    点击箭头处 工业之家 选择 关注公众号 工作台自动循环运动PLC控制指令与梯形图 一 数据传送指令 数据传送指令包括MOV 传送 SMOV BCD码移位传送 CML 取反传送 BMOV 数据块传送 FMOV 多点传送 XCH 数据交换 这里
  • FeignClient注解中各种属性详解

    一 value name 这两个属性的作用是一样的 如果没有配置url 那么配置的值将作为服务的名称 用于服务的发现 反之只是一个名称 注意 这里写的是你要调用的那个服务的名称 而不是你自己的那个服务的名称 另外 如果同一个工程中出现两个接