2016-07-26 85 views
4

我正在尋找一種方法來操作初始化時定義的@ConfigurationProperties,以便當我配置的對象使用@Bean方法時,它已正確配置。在春天操作配置屬性

場景:

我有一大堆的.yml文件中設置的屬性。由於所有這些屬性都與字符串匹配,因此其中一些屬性需要特殊處理才能正確配置爲各自的類型(其中一些是枚舉類型)。我是否將我的屬性對象設置爲@Component,然後將其注入@Bean方法並進行修改?我試圖合併@Bean@ConfigurationProperties註釋,但該對象在@Bean方法本身返回後配置,因此任何操作都會丟失/不可能。做這個的最好方式是什麼?

示例: 以我.yml我有此:

properties: 
    sports: 
    "football": ["Team 1", "Team 2", "Team 3"] 
    "basketball": ["Team 4", "Team 5", "Team 6"] 
    settings: 
    "football": 
     "period1": "45" 
     "period2": "90" 
     "players": "11" 
    "basketball": 
     "periods": "4" 
     "players": "5" 

而這些匹配中的下列對象:

Map<SportsEnum, List<TeamsEnum> 
Map<SportsEnum, Map<SportSettingsEnum, String>> 

TL; DR: 我想利用從配置的對象.yml/.properties文件並操作其注射表示。請提供具體的例子!

+3

Spring會做轉換爲你,你不需要做手工改寫(munging)。只需指定正確的枚舉名稱/值,即可支持要枚舉的字符串。 –

+0

嗯它似乎並不適合我,雖然:S。請注意,配置是'Map >'甚至是Map >' – Konstantine

+1

啊,但這是一個完全不同的野獸,超越了基本的轉換支持(您可能想要把這個添加到你的問題中......)。用你的'.yml'和你期望的java樣本。 –

回答

3

這是絕對支持的,我的猜測是你做錯了什麼。讓我們一步一步來。

首先,你的YAML文件格式錯誤,就應該是這個樣子:

properties: 
    sports: 
    football: 
     - Team1 
     - Team2 
     - Team3 
    basketball: 
     - Team4 
     - Team5 
     - Team6 
    settings: 
    football: 
     period1: 45 
     period2: 90 
     players: 11 
    basketball: 
     periods: 4 
     players: 5 

然後,你的配置屬性應該是這樣的:

@ConfigurationProperties(prefix = "properties", locations = "classpath:sports.yml") 
public class SportsProperties { 

    private Map<SportsEnum, List<TeamsEnum>> sports; 
    private Map<SportsEnum, Map<SportSettingsEnum, String>> settings; 

    public Map<SportsEnum, List<TeamsEnum>> getSports() { 
     return sports; 
    } 

    public void setSports(Map<SportsEnum, List<TeamsEnum>> sports) { 
     this.sports = sports; 
    } 

    public Map<SportsEnum, Map<SportSettingsEnum, String>> getSettings() { 
     return settings; 
    } 

    public void setSettings(
     Map<SportsEnum, Map<SportSettingsEnum, String>> settings) { 
     this.settings = settings; 
    } 

    @PostConstruct 
    public void customManipulation() { 
     System.out.println(sports); 
     System.out.println(settings); 
    } 
} 

接下來,性能應啓用您的配置:

@SpringBootApplication 
@EnableConfigurationProperties(SportsProperties.class) 
public class YamlSampleApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(YamlSampleApplication.class, args); 
    } 

} 

這應該是,真的。這裏是我的枚舉:

public enum SportsEnum { 
    football, basketball 
} 

public enum TeamsEnum { 
    Team1, Team2, Team3, Team4, Team5, Team6 
} 

public enum SportSettingsEnum { 
    periods, period1, period2, players 
} 

這裏的輸出我在日誌中獲取:

2016-07-26 17:44:41.226 DEBUG 30015 --- [   main] s.b.e.YamlPropertySourceLoader$Processor : Loading from YAML: class path resource [sports.yml] 
2016-07-26 17:44:41.282 DEBUG 30015 --- [   main] s.b.e.YamlPropertySourceLoader$Processor : Matched document with default matcher: {properties={sports={football=[Team1, Team2, Team3], basketball=[Team4, Team5, Team6]}, settings={football={period1=45, period2=90, players=11}, basketball={periods=4, players=5}}}} 
2016-07-26 17:44:41.282 DEBUG 30015 --- [   main] s.b.e.YamlPropertySourceLoader$Processor : Loaded 1 document from YAML resource: class path resource [sports.yml] 
{football=[Team1, Team2, Team3], basketball=[Team4, Team5, Team6]} 
{football={period1=45, period2=90, players=11}, basketball={periods=4, players=5}} 
+0

這是解決我的問題,具有配置屬性,但它不回答具體問題,我不能將其標記爲答案。但是,感謝您的洞察力。 – Konstantine

+0

不是嗎?你只需要把你想要的任何修改放入'@ PostConstruct'方法。雖然我現在看到,我從來沒有在答案中提到過這個:) –

+0

事實上,我沒有想到這一點。 – Konstantine