我的项目有一个依赖项,需要设置一个可以被@Value注释读取的属性对象:
@Value("#{myProps['property.1']}")
要在JavaConfig中执行此操作,我使用以下内容:
@Bean(name="myProps")
public static PropertiesFactoryBean mapper() {
PropertiesFactoryBean bean = new PropertiesFactoryBean();
bean.setLocation(new ClassPathResource("myprops.properties"));
return bean;
}
这可以按预期工作。我的属性如下所示:
property.1=http://localhost/foo/bar
property.2=http://localhost/bar/baz
property.3=http://localhost/foo/baz
我正在为这个项目使用Spring Boot,所以我希望能够做到以下的事情:
myprops.properties:
property.1=${base.url}/foo/bar
property.2=${base.url}/bar/baz
property.3=${base.url}/foo/baz
然后我可以根据不同的配置文件配置base.url。
application.yml:
base:
url: http://localhost
---
spring:
profiles: staging
base:
url: http://staging
---
spring:
profiles: production
base:
url: http://production
我试过这样做但它不起作用。作为一种解决方法,我创建了三个不同的.properties文件(myprops.properties,myprops-staging.properties等),并使用三个不同的@Configuration类加载它们。这有效,但看起来很麻烦。
@Configuration
public class DefaultConfiguration {
@Bean(name="myProps")
public static PropertiesFactoryBean mapper() {
PropertiesFactoryBean bean = new PropertiesFactoryBean();
bean.setLocation(new ClassPathResource("myprops.properties"));
return bean;
}
}
@Configuration
@Profile("staging")
public class StagingConfiguration {
@Bean(name="myProps")
public static PropertiesFactoryBean mapper() {
PropertiesFactoryBean bean = new PropertiesFactoryBean();
bean.setLocation(new ClassPathResource("myprops-staging.properties"));
return bean;
}
}
@Configuration
@Profile("production")
public class ProductionConfiguration {
@Bean(name="myProps")
public static PropertiesFactoryBean mapper() {
PropertiesFactoryBean bean = new PropertiesFactoryBean();
bean.setLocation(new ClassPathResource("myprops-production.properties"));
return bean;
}
}
是否可以配置我的PropertiesFactoryBean以从application.yml读取值?如果没有,是否有更简单的方法使用JavaConfig配置属性?
答案 0 :(得分:2)
我最终以编程方式执行此操作,它为我提供了我正在寻找的行为:
@Value("${base.url}")
private String baseUrl;
@Bean(name = "myProps")
public PropertiesFactoryBean mapper() throws IOException {
PropertiesFactoryBean bean = new PropertiesFactoryBean();
bean.setLocation(new ClassPathResource("myprops.properties"));
bean.afterPropertiesSet();
// replace ${base.url} in values
Properties props = bean.getObject();
Enumeration names = props.propertyNames();
while (names.hasMoreElements()) {
String name = names.nextElement().toString();
String value = props.getProperty(name);
if (value.contains("${base.url}")) {
props.setProperty(name, value.replace("${base.url}", baseUrl));
}
}
bean.setLocalOverride(true);
bean.setProperties(props);
bean.afterPropertiesSet();
if (log.isDebugEnabled()) {
log.debug("Base URL: " + baseUrl);
}
return bean;
}
答案 1 :(得分:1)
我不是百分之百确定你真正想要做什么,而且你并没有真正说出什么不起作用,但看起来你想要为你的外部配置混合YAML和属性格式?为什么不使用“application.yml”?如果我正在做类似的事情,并且我需要也出于某种原因使用属性文件,那么我会在我的@PropertySource
个源文件中使用SpringApplication
(这样,在我认为值得到解决时,应该替换占位符。