2016-07-26 76 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