覆盖application.properties中的值

时间:2016-04-07 09:39:08

标签: java spring

我编写与API client相关联的桌面应用程序,此API强制设置网址值

@Value("${ig.api.domain.URL}")
private String igApiDomainURL;

上面显示的igApiDomainURL设置在客户端api库的AbstractService.class中,因此我无法对其进行更改。

我创建BeanConfiguration.java,其中application.properties加载了ig.api.domain.URL

BeanConfiguration.java看起来像这样:

@Configuration
@PropertySource("application.properties")
public class BeanConfiguration {

    @Bean
    public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }

    @Bean
    public HttpClient httpClient() {
        return HttpClients.createDefault();
    }
}

...而application.properties包含:

ig.api.domain.URL=https://demo-api.ig.com/gateway/deal

我希望在riunning应用程序期间更改application.properties中更改的URL地址(根据帐户类型更改URL地址 - DEMO / LIVE)。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

经过长时间的讨论后,最终适用于这个非常具体的场景的是这样的事情:

为您想要的每个可能的配置文件创建属性文件,例如:

application-dev.properties
application-prod.properties

属性内容示例:

property.i.want=abcd

在创建ApplicationContext之前设置env:

System.setProperty("spring.profiles.active", "dev");
ClassPathXmlApplicationContext  context =
                new ClassPathXmlApplicationContext(new String[] {"spring.xml"});

然后手动设置属性源,即:

@Bean
public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() throws IOException {
    String profile = System.getProperty("spring.profiles.active");
    PropertySourcesPlaceholderConfigurer pspc = new PropertySourcesPlaceholderConfigurer();
    Resource resource = new ClassPathResource(String.format("application-%s.properties", profile));
    Properties props = PropertiesLoaderUtils.loadProperties(resource);
    pspc.setProperties(props);
    pspc.setPropertySources();
    return pspc;
}

但绝对不是最漂亮的解决方案。