我有以下情况:
@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
RestTemplate
bean 已成功注入,但我的Mapoverrides
始终为空。几天前,当我最后一次测试这段代码时,这种方法似乎奏效了。
有趣的是,我在参考文档中发现了这一点:
我们建议 @ConfigurationProperties 只处理环境,特别是不要从上下文中注入其他 bean。对于极端情况,可以使用 setter 注入或框架提供的任何 *Aware 接口(例如 EnvironmentAware,如果您需要访问 Environment)。如果您仍然想使用构造函数注入其他 bean,则配置属性 bean 必须使用 @Component 注释并使用基于 JavaBean 的属性绑定。
这让我认为这种方法永远都不应该奏效(我无法弄清楚它为什么会奏效,因为上述方法的替代方法都失败了)。
试图让我的@Configuration
类注入RestTemplate
via 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"
似乎没有问题。我究竟做错了什么?