2016-12-15 2 views
1

私のapplication.ymlファイル内にいくつかの設定を追加しました。私はJavaコードから読みたいと思います。springでapplication.ymlの情報を取得する

YAMLファイル内の追加ノードには、次のようになります。

myConfig: 
    projectOne: 
     mantisID: 501 
     user: username 
     password: passwd 
    projectTwo: 
     mantisID: 502 
     user: username 
     password: passwd 

私がしたいことは
Project.mantisID = 501、
Project.user =「ユーザ名プロジェクトオブジェクトの一覧を取得することです」、
は Project.password = "" passwdの

等...

私はスプリンガーパを知っていますgは@Valueアノテーションでこのファイルを読むことができますが、必要なものを得るためにこれをどのように使用できますか?

+0

YAMLファイルにコードが表示されません。スカラーとマッピングのみがあります。あなたはYAMLファイルを書き換える方法を尋ねていますか?そうでなければ[タグ:yaml]が不適切に適用されます – Anthon

+0

私は "ノード"、 "マッピング"を意味しました。私は正しい言葉を知らない。私は要素を意味した。 –

+0

YAMLの要素はシーケンス内でのみ発生しますが、YAMLには要素がありません。正しいYAMLの用語(1つの言語/パーサーのみを使用する場合によく起こります)がわからない場合は、少なくともあなたの言語の名前にプレフィックスを付けます( 'Java node')。そして、あなたが間違ったことを書いたことにお気づきのように、それを編集して訂正することによって、将来の読者にとってより役立つ質問にしてください。 **あなたの**問題は解決されるかもしれませんが、ここで質の高いQ&Aサイトを構築しようとしています。 – Anthon

答えて

1

@ConfigurationProperties注釈を使用してBeanに設定をマップすると、Beanをどこにでも注入してこれらのプロパティを取得できます。

これを行うには、まず、構成内のデータ構造を表すクラスを作成します。次に、@ConfigurationProperties@Configuration注釈で注釈を付けます。ゲッターとセッターがProjectクラスで必要とされている

@Configuration 
@ConfigurationProperties 
public class MyConfig { 

    private final Map<String, Project> myConfig = new HashMap<>(); 

    public Map<String, Project> getMyConfig() { 
     return myConfig; 
    } 

    public static class Project { 

     private String mantisID; 
     private String password; 
     private String user; 

     // Getters and setters... 
    } 
} 

注意。ゲッタとセッタの命名はここで重要であることにも留意してください。

このクラスをセットアップしたら、プロジェクトの任意の場所に注入してそのプロパティにアクセスできます。

@Service 
public class SomeService { 

    private final Map<String, MyConfig.Project> projects; 

    @Autowired 
    public SomeService(MyConfig config) { 
     this.projects = config.getMyConfig(); 

     projects.get("projectOne").getMantisID(); 
     projects.get("projectTwo").getPassword(); 
    } 
} 

この詳細については、hereを参照してください。

+0

よろしくお願いします。私はあなたが提供するオンラインリソース上にいましたが、実際にこの方法から推測することはできませんでした^^。 別の質問があります。プロジェクトリストをforeach内に置くにはどうすればいいですか?私のユーザが.ymlファイルの中に "projectThree"を追加したとします。 myConfig:エントリのすべてのプロジェクトの子を自動的にフェッチする必要があります。 –

+0

私があなたの質問を正しく理解していれば、 '.values()'や '.entrySet()'メソッドを使ってすべてのマップ値を取得し、それらを反復することができます。 'projects.values()。forEach(p - > {/ *あなたのプロジェクトで何かする* /});'。 – Edd

0

ちょうど終了するまで、私は自分の2番目の質問に答えました。 これは私のサービスは現在、次のようになります。

@Service 
public class MantisProjectService { 

    private final Map<String, MantisProjectConfiguration.Project> projects; 

    private List<MantisProjectConfiguration.Project> mantisProjects = new ArrayList<>(); 

    @Autowired 
    public MantisProjectService(MantisProjectConfiguration mantisProjectConfiguration) 
    { 
     this.projects = mantisProjectConfiguration.getMantisProjectConfiguration(); 

     for (Map.Entry<String, MantisProjectConfiguration.Project> project : projects.entrySet()) 
     { 
      MantisProjectConfiguration.Project mantisProject = project.getValue(); 
      mantisProject.setName(project.getKey()); 
      mantisProjects.add(mantisProject); 
     } 
    } 

    public List<MantisProjectConfiguration.Project> getMantisProjects() 
    { 
     return mantisProjects; 
    } 

} 

それはすべてのプロジェクトのリストを返します。そしてそれは素晴らしいです! =)

関連する問題