首页 > 其他分享 >配置动态刷新@RefreshScope引起的取值为null

配置动态刷新@RefreshScope引起的取值为null

时间:2024-03-23 21:55:53浏览次数:31  
标签:configInfo return String bean RefreshScope null 取值

配置动态刷新@RefreshScope引起的取值为null

 在Spring Cloud Config 动态刷新demo编写中,分为三个步骤:

 1)git端配置更改,代码提交

 2)手动刷新配置: POST请求: http://localhost:3355/actuator/refresh

 

 3)客户端访问配置:http://localhost:3355/testConfig

 控制类代码如下:

 1 @RestController
 2 @RefreshScope
 3 public class ConfigClientTestController {
 4     @Value("${config.info}")
 5     private String configInfo;
 6     
 7     /**
 8      * 读取配置文件内容
 9      *
10      * @return
11      */
12     @GetMapping("testConfig")
13     private String configInfo() {
14         return configInfo;
15     }
16 }

  这个时候发现问题,客户端根本读取不到配置。

  分析:

   1)@RefreshScope 注解是 Spring Cloud 中用于标记需要在配置发生变化时进行刷新的 bean 的注解。当一个 bean 被 @RefreshScope 注解标记时,Spring 在创建这个 bean 的代理对象时会注入一些额外的逻辑,以便在配置变化时刷新这个 bean 的属性值。

   2)代理对象是 Spring Framework 在运行时动态创建的对象,它包装了真实的 bean 对象,并在需要时执行一些额外的操作,比如在配置变化时刷新属性值。在使用 @RefreshScope 注解时,Spring 创建了一个代理对象来管理被注解标记的 bean,并在需要时负责刷新这个 bean 的属性值。

   3)当我们在调用方法时,实际上是调用了代理对象的方法,代理对象会负责处理实际的调用逻辑,包括在配置变化时刷新属性值。因此,通过方法调用可以获取到最新的属性值,但直接访问 bean 的字段可能会得到旧值或者 null,因为直接访问的是代理对象的字段,而不是真实的 bean 对象。

   根据上面的分析,将代码再改动一下:

 1 @RestController
 2 @RefreshScope
 3 public class ConfigClientTestController {
 4     @Value("${config.info}")
 5     private String configInfo;
 6 
 7     public String getConfig() {
 8         return configInfo;
 9     }
10 
11     /**
12      * 读取配置文件内容
13      *
14      * @return
15      */
16     @GetMapping("testConfig")
17     private String configInfo() {
18         return getConfig();
19     }
20 }

    这样就可以正常读取值了。

    @RefreshScope 会使注入的值放到代理类中,而当前bean的属性字段是没有值的,直接读取bean的field会为null,只有通过方法(不一定是get方法)才会触发去代理类中取值

   看到网上很多文章提到在@Controller中直接@Value获取不到值,解决方法是定义另外一个配置类,再取值就可以了。

   配置类:

 1 @Component
 2 @RefreshScope
 3 public class ConfigData {
 4     @Value("${config.info}")
 5     private String configInfo;
 6 
 7     public String getConfigInfo() {
 8         return configInfo;
 9     }
10 }

   控制类:

 1 @RestController
 2 @RequiredArgsConstructor(onConstructor_ = {@Autowired})
 3 public class ConfigClientController {
 4 
 5     private final ConfigData configData;
 6 
 7     /**
 8      * 读取配置文件内容
 9      *
10      * @return
11      */
12     @GetMapping("getConfigInfo")
13     private String configInfo() {
14         return configData.getConfigInfo();
15     }
16 }

  这样也能正常读取到手动刷新后的配置值。不过,归根结底,出现读取不到最新值的原因其实跟取值方式有关, 都是代理惹的祸。

取值方式  无@RefreshScope 有@RefreshScope
方式1(field取值)  有值  null
方式2(方法取值)  有值  有值

 

 

 

 

 

 

 参考链接: https://www.jianshu.com/p/a535f8250cb2 

标签:configInfo,return,String,bean,RefreshScope,null,取值
From: https://www.cnblogs.com/hld123/p/18091740

相关文章

  • 【已解决】null value in column “XXX“ violates not-null constraint当我数据库的
    报错信息:nullvalueincolumn"id"violatesnot-nullconstraintDetail:Failingrowcontains(11110,1,null) 一般来说,是因为插入的主键Id为空引起的。这就和我们数据库中的设置默认值产生了冲突,我设置了默认值,为什么他还是报这个字段不能为空的错误?这个时候就要......
  • in,not in,like,not like,=,!=与null的恩怨情仇
    1.情景展示当字段值为null时,会给我们的查询带来不小的麻烦,今天就来聊一聊:in(),notin(),like,notlike,=,!=或<>在字段值为null时,出现的各种问题。2.具体分析以oracle进行举例分析。in()  notin() like notlike = !=或<> 3.解决方案使用exists(),no......
  • Spring中@NotNull注解@Valid注解简介及使用
    前言在开发中,为了代码的稳定性不报空指针异常,经常需要判断前端传过来的值是否为空,为空的话就返回前端值为空的提示,才能进行下一步的操作,例如登录操作需要判断传过来的登录名和密码是否为空:@GetMapping("login")publicResultlogin(Useruser){if(StringUti......
  • 350_{"code":401,"msg":"认证失败,无法访问系统资源","data":null}
    若依框架部署Linux访问报错,401认证失败,无法访问系统资源_认证失败,无法访问系统资源_冰糖码奇朵的博客-CSDN博客报错信息链接访问nginx配置解决......
  • VUE前端打包报错:TypeError: Class extends value undefined is not a constructor or
    在执行npmrunbuild的时候遇到了错误:TypeError:Classextendsvalueundefinedisnotaconstructorornull;而执行npmrunserve是可以正常执行的,报错如下:buildingforproduction...ERRORTypeError:ClassextendsvalueundefinedisnotaconstructorornullTypeErr......
  • mysql索引(索引失效,遵循最左前缀,使用1.全值匹配 2.覆盖索引,失效:索引加函数,范围查询右边
    1.遵循联合索引最左列原则当表中创建了一个联合索引idx_name_age_position案例演示1.当我们在执行sql语句:以name为where条件时,我们可以用到索引EXPLAINSELECT*FROMemployeesWHEREname='LiLei';2.当我们在执行sql语句:以age为where条件时,索引就会失效......
  • mysql null值比较
    在SQL查询中,使用NULL值的比较需要使用ISNULL或ISNOTNULL运算符,而不是使用等号(=)进行比较。如果您想筛选出bc.id不为NULL的记录,可以使用ISNOTNULL运算符进行条件判断。以下是修改后的示例查询:sql复制SELECT*FROMbadgesASbLEFTJOINbadge_categori......
  • MySQL默认值NULL、空值、Empty String的区别,哪个更好?
    一套完美的系统,离不开数据库的设计。当我们数据库添加一个新的字段的时候,你会设置默认值为NULL,空值、还是EmptyString呢?首先我们来看下这三种值的介绍空值,空白,即什么都不填,等同于NULL(设计表结构时保存空值会自动变成NULL),当然也可以手动输入默认值。NULL。EmptyString,空字......
  • NOT IN子查询中出现NULL值对结果的影响你注意到了吗
    前言开发人员写的SQL语句中经常会用到in,exists,notin,notexists这类子查询,通常,含in、exists的子查询称为半连接(semijoin),含notin、notexists的子查询被称之为反连接,经常会有技术人员来评论in与exists效率孰高孰低的问题,我在SQL优化工作中也经常对这类子查询做优化改写,比如半......
  • C#try捕捉不了NullReferenceException
    用debug运行以下代码出现空指针错误double[]EnergyScaleValue=newdouble[3];try{EnergyScaleValue=null;}catch(NullReferenceExceptionee){MessageBox.Show("请先选择样品!");......