2017-09-19 8 views
0

에 ConfigurationProperties 콩 작동하지 아래 빈 :를 autowire 내가 아래 개체의 목록이있는 application.yml 파일이 봄

MailBoxProperties.java 나는 위의 설정을 주입하려는

@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)를 제공하려고 시도했지만, 실제 빈 경로와 null이있는 빈이 2 개 생성된다는 예외가 발생합니다. @Import() {MailBoxProperties.class}를 시도했습니다.

하지만 주입은 내 응용 프로그램 클래스에서 다음과 같이 완벽하게 작동합니다. 빈을 가져 와서 사서함 이름을 올바르게 인쇄합니다.

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

'null'는'getMailBoxProperties' 봄 전의 한 필드를 자동 와이어 연결로 변경하십시오. –

답변

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; 
     } 
    } 
} 

그런 다음 당신은 당신의 OutlookConnectionManager@Configuration 주석하지만 당신이 그 안에 일을하려고하는 것은 조금 anorthodox이다 (당신이 new 키워드와 동일한 구성 클래스를 다시 인스턴스화하는) 유지할 수 있습니다 .

OutlookConnectionManager : 당신이 당신의 @Bean 방법을 변경하여 작업 할 수 그러나

당신이 t 호출을 시도하고 있기 때문에

그것은이다
@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

이 두 행은 this.getMailBoxProperties(); // this.names를 outlookConnectionManager 인스턴스의 names 변수로 설정합니다. outlookConnectionManager.names = this.names; 많은 시간을 절약했습니다. 고마워. – Ashwini

0

@ m-deinum이 지적했듯이 속성은 여전히 ​​null입니다. @PostConstruct 주석이 달린 메소드에서 초기화를 시도하십시오. 모든 autowired 필드는 그 지점으로 채워 져야합니다.

@PostConstruct 여기에 대한 자세한 내용은 : 내가 생각 How to call a method after bean initialization is complete?

0

2 가지가 있습니다 당신은 수정할 수 있습니다


먼저 당신이 필드 mailboxes에 대한 귀하의 MailBoxProperties (같은 setMailBoxes에 이상한 getter 및 setter 이름이 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; 
    } 
}