2017-09-19 4 views
0

でConfigurationProperties豆のために働いていない私は以下のようにオブジェクトのリストを持っているapplication.ymlファイルがあります:私は、これらの特性を有することがMailBoxPropertiesと呼ばれる春の設定クラスを作成しているAutowired春

outlook: 
    mailboxes: 
    - id: m1 
     name: mailbox1 

    - id: m2 
     name: mailbox2 

を以下のようにビーン:

MailBoxProperties.java Iは、上記の設定を注入したい

@ConfigurationProperties(prefix = "outlook") 
@Configuration 
public class MailBoxProperties { 

    private List<MailBox> mailboxes; 

    public MailBoxProperties() { 

    } 

    public MailBoxProperties(List<MailBox> mailboxes) { 
     this.mailboxes = mailboxes; 
    } 

    public void setMailBoxes(List<MailBox> mailboxes) { 
     this.mailboxes = mailboxes; 
    } 

    public List<MailBox> getMailBoxes() { 
     return mailboxes; 
    } 

    public static class MailBox { 
     public String getName() { 
      return this.name; 
     } 

     public String getId() { 
      return this.id; 
     } 


     private String id, name; 

     public MailBox() { 

     } 

     public MailBox(String id, String name) { 
      this.id = id; 
      this.name = name; 
     } 
    } 
} 

以下のような別のコンフィギュレーションクラスにビーン:

OutlookConnectionManager.java

@Configuration 
@EnableConfigurationProperties 
public class OutlookConnectionManager{ 
    @Autowired 
    private MailBoxProperties mailBoxProperties; 

    private List<String> names; 

    @Bean 
    public OutlookConnectionManager getOutlookConnectionManager() { 
     OutlookConnectionManager outlookConnectionManager = new OutlookConnectionManager(); 
     outlookConnectionManager.getMailBoxProperties(); 
     return outlookConnectionManager; 
    } 

    public void getMailBoxProperties() { 
     names = new ArrayList<String>(); 
     for(MailBox mail: mailBoxProperties.getMailBoxes()) { 
       this.names.add(mail.getName()); 
     } 
    } 
} 

しかし、MailBoxPropertiesは常にnullでgetMailBoxPropertiesから()を呼び出すmailBoxProperties.getMailBoxesにヌル・ポインタ例外をスローします。

@Configuration @EnableConfigurationProperties(MailBoxProperties.class)を与えようとしましたが、2つのBeanが作成されたことを示す例外がスローされます。 @Import(){MailBoxProperties.class}を試しました。

しかし、注入は以下のように私のメインアプリケーションクラスで完全に機能します: これは、Beanを取り出してメールボックス名を正しく出力します。

MailApplication.java

@SpringBootApplication 
public class MailApplication { 

    public static void main(String[] args) { 
     ApplicationContext context = new SpringApplicationBuilder(MailApplication.class).run(args); 
MailBoxProperties props = context.getBean(MailBoxProperties.class); 
props. getMailBoxes() 
       .forEach(cc -> System.out.println(cc.getName())); 

} 
} 

私はOutlookConnectionManager.javaのいずれかの設定をしないのですか?助けてください。

注: 私は春ブーツ1.5.7.RELEASE

はありがとうを使用しています。

+0

春がきた前にあなたがトンコール 'getMailBoxProperties'をしようとしているので、それは' null'なのでありますフィールドの自動配線に変更します。 –

答えて

2

と同様の動作を実現することができると思う基本的にはあなたのMailBoxProperties @varrenが提案されているようにする必要があります。そして、このプロパティクラス@Configurationで注釈を付ける必要はありません。だから、

@ConfigurationProperties(prefix = "outlook") 
public class MailBoxProperties { 

    private List<MailBox> mailboxes; 

    public List<MailBox> getMailboxes() { 
     return mailboxes; 
    } 

    public void setMailboxes(List<MailBox> mailboxes) { 
     this.mailboxes = mailboxes; 
    } 

    public static class MailBox { 
     private String id, name; 

     public String getId() { 
      return id; 
     } 

     public void setId(String id) { 
      this.id = id; 
     } 

     public String getName() { 
      return name; 
     } 

     public void setName(String name) { 
      this.name = name; 
     } 
    } 
} 

その後、あなたは(あなたがnewキーワードと同じ構成のクラスを再インスタンス化されている)@Configurationで注釈を付け、あなたのOutlookConnectionManagerを保つが、あなたがそれの内側にやろうとしていることはほとんどないanorthodoxであることができます。

あなたはそれがあなたの @Bean方法を変更して動作させることができしかし

OutlookConnectionManager

@Bean 
public OutlookConnectionManager getOutlookConnectionManager() { 
    OutlookConnectionManager outlookConnectionManager = new OutlookConnectionManager(); 
    //this call will set this.names 
    this.getMailBoxProperties(); 
    //set this.names to the names variable of outlookConnectionManager instance 
    outlookConnectionManager.names = this.names; 
    return outlookConnectionManager; 
} 
+2

これらの2つの行、this.getMailBoxProperties(); // this.namesをoutlookConnectionManagerインスタンスのnames変数に設定します。 outlookConnectionManager.names = this.names;多くの時間を節約しました。どうもありがとう – Ashwini

0

@ m-deinumが指摘しているように、プロパティはまだnullです。 @PostConstructで注釈を付けられたメソッドで初期化を試みてください。すべてのautowiredフィールドにそのポイントが設定されている必要があります。ここ@PostConstructについて

詳細:


まず、あなたのMailBoxPropertiesフィールドmailboxesのため(のようなsetMailBoxesにいくつかの奇妙なゲッターとセッターの名前を持っている:How to call a method after bean initialization is complete?

0

は、私はあなたが修正することができます2つのことがあると思いますsetMailboxes)と私はMailBoxPropertiesカスタムセッター名でyamlファイルから値を取るとは思わない。デフォルトを使用getterとsetter

@ConfigurationProperties("outlook") 
public class MailBoxProperties { 

    private List<MailBox> mailboxes; 

    public List<MailBox> getMailboxes() { 
     return mailboxes; 
    } 

    public void setMailboxes(List<MailBox> mailboxes) { 
     this.mailboxes = mailboxes; 
    } 

    public static class MailBox { 
     private String id, name; 

     public String getId() { 
      return id; 
     } 

     public void setId(String id) { 
      this.id = id; 
     } 

     public String getName() { 
      return name; 
     } 

     public void setName(String name) { 
      this.name = name; 
     } 
    } 
} 

第二に、私は、OutlookConnectionManagerであなたの目標が何であるかを知らないが、@Mとして

。 Deinum mentioned春にフィールドの自動配線が変更される前に、 getMailBoxPropertiesに電話をかけようとしています。

は、私はあなたが

@Component 
public class OutlookConnectionManager{ 

    private final MailBoxProperties mailBoxProperties; 

    private List<String> names; 

    @Autowired 
    public OutlookConnectionManager(MailBoxProperties mailBoxProperties) { 
     this.mailBoxProperties = mailBoxProperties; 
     this.names = getNames(); 
    } 


    public List<String> getNames() { 
     List<String> names = new ArrayList<>(); 
     for(MailBoxProperties.MailBox mail: mailBoxProperties.getMailboxes()) { 
      names.add(mail.getName()); 
     } 
     return names; 
    } 
} 
関連する問題