Java Spring-如何在不枚举所有必需属性的情况下获取属性文件的子集
我正在加载我的属性文件,如下所示:Java Spring-如何在不枚举所有必需属性的情况下获取属性文件的子集,java,spring,hikaricp,spring-properties,Java,Spring,Hikaricp,Spring Properties,我正在加载我的属性文件,如下所示: @Configuration @PropertySource("classpath:app.properties") class MyApp { @Bean public PropertySourcesPlaceholderConfigurer PropertySourcesPlaceholderConfigurer() { return new PropertySourcesPlaceholderConfigurer();
@Configuration
@PropertySource("classpath:app.properties")
class MyApp {
@Bean
public PropertySourcesPlaceholderConfigurer PropertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
}
在属性文件中,我有几个与数据库相关的属性:
database.dataSource.url=jdbc:postgresql://localhost:${db-port:5432}/mydb
database.dataSource.x=...
database.dataSource.y=...
database.dataSource.z=...
注:
${db port}应替换为属性/环境变量db port或5432的值。在我的例子中,我在生成Tomcat容器时定义了环境变量db port
所有与数据库相关的属性都分组在数据库下。根这是有意的,见下文
我希望避免在代码中枚举/硬编码所有可能的数据库相关属性。幸运的是,使用中的数据库层Hikari有一个很好的特性,我可以通过java.util.properties传递所有属性。所以,我希望检索数据库*下所有定义的属性,并将其转发给Hikari
为此,我编写了以下实用程序:
@Component
public class PropertyFetcher
{
@Autowired
private ConfigurableEnvironment environment;
public Properties get(final String key) {
final Properties p = new Properties();
for (final PropertySource<?> s : environment.getPropertySources()) {
if (s instanceof EnumerablePropertySource) {
for (final String k : ((EnumerablePropertySource) s).getPropertyNames()) {
if (k.startsWith(key) && k.length() > key.length()) {
p.put(k.substring(key.length()), s.getProperty(k));
}
}
}
}
return p;
}
}
而不是
jdbc:postgresql://localhost:9876/mydb
因此,出于某种原因,${db port:5432}尚未解析?当通过此路线时,可配置环境
如何解决这个问题?或者有没有更好的方法来获取某个根下的所有属性,而不必在代码中枚举/硬编码它们
请注意,在默认场景中,property database.dataSource.url=jdbc:p中的${db port:5432}ostgresql://localhost:${db port:5432}/mydb已正确解析。我通过定义以下成员并将其记录下来来对此进行测试:
@Value("${database.dataSource.url}")
final String url; // holds jdbc:postgresql://localhost:9876/mydb
您应该仅从真实环境中读取属性值。然后,只有您才能获得财产的实际或有效价值 这将需要对代码进行一些更改 更改此行:
p.put(k.substring(key.length()), s.getProperty(k));
为此:
p.put(k.substring(key.length()), environment.getProperty(k));
太好了,这个修好了!我已经有了环境ConfigurableEnvironment,所以我刚刚调用了environment.getPropertyk,它就可以工作了!还是应该有充分的理由单独注入环境而不是ConfigurableEnvironment?ConfigurableEnvironment扩展了环境。因此,最好只注射一次。谢谢你这么说。我会相应地更新答案。太好了!谢谢。
p.put(k.substring(key.length()), environment.getProperty(k));