0

我有以下情况:

@Configuration
@ConfigurationProperties(prefix = "my.prefix")
@ConditionalOnProperty(value = "my.prefix.should-enable", havingValue = "true")
@RequiredArgsConstructor // lombok
public class MyConf {


  @Setter
  private Map<String, SettingOverride> overrides = Collections.emptyMap();
  private final RestTemplate restTemplate;

  @Data
  public static class SettingOverride {
  
    private final boolean enabled;
  }
}

以及以下配置(仅通过 为特定配置文件启用application-profilename.yml):

---
my:
  prefix:
    should-enable: true
    overrides:
      SOME_SETTING:
        enabled: true

RestTemplatebean 已成功注入,但我的Mapoverrides始终为空。几天前,当我最后一次测试这段代码时,这种方法似乎奏效了。

有趣的是,我在参考文档中发现了这一点:

我们建议 @ConfigurationProperties 只处理环境,特别是不要从上下文中注入其他 bean。对于极端情况,可以使用 setter 注入或框架提供的任何 *Aware 接口(例如 EnvironmentAware,如果您需要访问 Environment)。如果您仍然想使用构造函数注入其他 bean,则配置属性 bean 必须使用 @Component 注释并使用基于 JavaBean 的属性绑定。

这让我认为这种方法永远都不应该奏效(我无法弄清楚它为什么会奏效,因为上述方法的替代方法都失败了)。

试图让我的@Configuration类注入RestTemplatevia egApplicationContextAware和默认构造函数,如上述文档中所建议的那样,也不起作用。

由于这是一个测试配置类,如果所有相应的属性和结构都在一个类中,那将是理想的。

使用其他属性的不同配置类,例如(注意:没有注入的 bean):

@Data // lombok
@Configuration
@ConditionalOnProperty(value = "my.other-prefix.should-enable", havingValue = "true")
@ConfigurationProperties(prefix = "my.other-prefix")
public class MyOtherConf {

  private String someValue;
  private Map<String, String> settings = Collections.emptyMap();

}

配置为:

---
my:
  other-prefix:
    should-enable: true
    settings:
      another-value: "anothervalue"

似乎没有问题。我究竟做错了什么?

4

0 回答 0