@RefreshScope 和 @ConditionalOnProperty 不起作用

Posted

技术标签:

【中文标题】@RefreshScope 和 @ConditionalOnProperty 不起作用【英文标题】:@RefreshScope with @ConditionalOnProperty does not work 【发布时间】:2018-02-26 12:06:13 【问题描述】:

问题

探索在不重新启动 JVM 的情况下按需启用/禁用 @RequestMapping 端点的选项。在运行时在端点上实现终止开关。

尝试

我尝试了以下方法,但 @RefreshScope 似乎不适用于 @ConditionOnProperty

@RestController
@RefreshScope
@ConditionalOnProperty(name = "***.endpoints", havingValue = "enabled")
public class MyController 

    @Value("$***.endpoints")
    String value;

    @RequestMapping(path = "/sample", method = RequestMethod.GET)
    public ResponseEntity<String> process() 
        return ResponseEntity.ok(value);
    


使用更新的属性

POST /env?***.endpoints=anyvalue

并使用重新加载上下文

POST /refresh

此时控制器返回更新后的值。

问题

还有其他方法可以实现所需的功能吗?

【问题讨论】:

基本上你想做的事情是不可能的。下面的链接解释了原因。 github.com/spring-cloud/spring-cloud-config/issues/1645 【参考方案1】:

Boot 中的条件仅适用于 Configuration 类级别或 bean 定义级别。

这可能会对你有所帮助。

public class MyWebConfiguration extends WebMvcConfigurationSupport 
 @Bean
 @ConditionalOnProperty(prefix="***.endpoints",name = "enabled")
 public MyController myController() 
    return new MyController ();
 

【讨论】:

以上是关于@RefreshScope 和 @ConditionalOnProperty 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

@RefreshScope 似乎忽略了 Mockito 的嘲笑

SpringBoot+Nacos:@RefreshScope自动刷新原理

@LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析

@RefreshScope 加在 Quartz 触发器类导致异常问题分析

SpringCloud @RefreshScope实现原理

配置类中的@RefreshScope