2016-07-26 4 views
4

@ConfigurationPropertiesを初期化時に定義して、@Inject/@Autorwiredの設定済みオブジェクトを@Beanメソッドで設定したときに正しく設定されるようにする方法を探しています。春の設定プロパティを操作する

シナリオ:

私は.ymlファイルに設定されたプロパティの束を持っています。これらのプロパティはすべてStringとして一致するため、それらのうちのいくつかはそれぞれの型に適切に構成するために特別な処理が必要です(そのうちのいくつかは列挙型です)。プロパティオブジェクトを@Componentにして@Beanメソッドに挿入して変更しますか?私は@Bean@ConfigurationProperties注釈を結合しようとしましたが、オブジェクトは@Beanメソッド自体が返ってから設定されていますので、操作は紛失/不可能です。これを行う最善の方法は何ですか?

例:

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で 私はこれ持って、私はから構成されたオブジェクトを取りたい を.yml/.propertiesファイルを開き、その注入可能な表現を操作します。具体的な例を挙げてください!

+3

春はあなたのための変換を行います、あなたは手動でいじるをする必要はありません。列挙型の列挙は、正しい列挙型の名前/値を指定するだけですぐにサポートされます。 –

+0

hmmそれは私のために働くように思わない: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

これは、プロパティを設定するHAVINGの問題を解決しますが、特定の質問には答えず、回答としてマークすることはできません。しかし、あなたの洞察力に感謝します。 – Konstantine

+0

それはありますか? '@ PostConstruct'メソッドに必要な変更を加えるだけです。私は今私が答えでこれを言及したことがないことを参照してください:) –

+0

確かに私はそれについて考えなかった。 – Konstantine

関連する問題