2013-01-08 54 views
11

讓此類覆蓋另一個Config類中已設置的@PropertySource。如何覆蓋Spring 3.1 @PropertySource來設置IgnoreResourceNotFound&IgnoreUnresolvablePlaceholders

@Configuration 
@PropertySource({ "classpath:${env.placeholder}/app.properties" }) 
public class PropertyOverrideConfig { 

} 

但是,無論何時文件或佔位符丟失,它的上下文加載失敗。我需要將下列標誌設置爲該註解加載的屬性,以便它將跳過,如果它無法找到該屬性。

 setIgnoreResourceNotFound(true); 
     setIgnoreUnresolvablePlaceholders(true); 

問題1:什麼是適當的方式來設置這些標誌爲@PropertySource?

更新: 嘗試添加一個@Bean同一類而沒有註釋引用this頁,它不採摘屬性文件要麼。我沒有一個XML配置。

@Bean 
public static PropertySourcesPlaceholderConfigurer properties() { 
    final PropertySourcesPlaceholderConfigurer pspc = new PropertySourcesPlaceholderConfigurer(); 

    Resource[] resources = new ClassPathResource[ ] { 
        new ClassPathResource("classpath:${env.placeholder}/app.properties") }; 

    pspc.setLocations(resources); 
    pspc.setIgnoreResourceNotFound(true); 
    pspc.setIgnoreUnresolvablePlaceholders(true); 
    return pspc; 
} 

問題2:我相信,我失去了一些東西,但無法弄清楚它是什麼,任何幫助將是巨大的。

+0

你確定沒有其他PropertySourcesPlaceholderConfigurer實例註冊嗎?也許你應該使'@ Bean'註釋方法返回PropertySourcesPlaceholderConfigurer static(因爲@ @ Bean推薦的java文檔) –

+0

謝謝@BorisTreukhov,發佈時我錯過了靜態。同時,如果我有相同的'PropertySourcesPlaceholderConfigurer'已經在不同的Config上註冊了bean,會發生什麼? – raksja

+0

我不記得確切的,但你可以有幾個PropertySourcesPlaceholderConfigurers(並指定它們不同的佔位符前綴/後綴) - 也許有另一個佔位符配置器哪些抱怨關於無法解析的佔位符 –

回答

4

我想,我終於想通了對問題1回答:

如何設置忽略標誌通過@PropertySource添加的屬性?

它不存在在Spring的是,它被提出作爲次要 改進。希望在將來的版本中能夠看到添加到註釋中的附加屬性 。

SPR-8371

仍不能確定完成提到的場景的方式,沒有答案問題2。

+1

還有[SPR-10325](https ://jira.springsource.org/browse/SPR-10325):「允許@PropertySource上的ignoreResourceNotFound」,投票支持! – Robin

0

嘗試刪除classpath:,它不需要使用ClassPathResource時:

new ClassPathResource("classpath:${env.placeholder}/app.properties") }; 
1

不是一個真正的解決方案,而是一個解決辦法,如果你要堅持彈簧3:使用虛擬默認情況下,它存在,即在你的情況下:

@PropertySource({ "classpath:${env.placeholder:dummy}/app.properties" })